生成随机数,不再显示,未知数字池

时间:2014-01-31 10:20:54

标签: c# random numbers repeat

你好,我写了一个程序,它显示了文件夹中的任何图片,.exe就在。 它包含一个按钮,随机地“按”。选择另一张照片并显示出来。 它到目前为止一直有效。

接下来我要做的是,按钮选择之前未选择过的图片。并且只有在显示每张图片时,程序才会重置并重新开始显示所有图片。

但是当我现在启动该程序时,它会显示一张照片,就是这样。按钮没有做任何可见的事情,你无法改变第一张照片 - 我不知道为什么。 (我看到类似的问题,比如二十一点话题。但在我的情况下,我不知道会有多少张图片,所以我无法创建一个固定数字的修复池和从列表中删除它们或类似的东西。)

所以这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace randompix
{
    public partial class Form1 : Form
    {

        int i = 0;
        Random rnd = new Random();
        string pfad = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
        IEnumerable<string> allebilder; // Will contain every filename of the folder
        List<int> wdhlist = new List<int>(); //will contain 'i' that was already used



        public Form1()
        {
            InitializeComponent();
            this.WindowState = FormWindowState.Maximized;
            pBox1.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top);
            pBox1.SizeMode = PictureBoxSizeMode.Zoom;
            btn2.Anchor = (AnchorStyles.Top | AnchorStyles.Right);

            allebilder = Directory.EnumerateFiles(pfad); 
            wdhlist.Add(i);

            if (allebilder.ElementAt<string>(i).EndsWith(".jpg") || allebilder.ElementAt<string>(i).EndsWith(".jpeg") || allebilder.ElementAt<string>(i).EndsWith(".png") || allebilder.ElementAt<string>(i).EndsWith(".gif") || allebilder.ElementAt<string>(i).EndsWith(".bmp"))
            {
                pBox1.ImageLocation = allebilder.ElementAt<string>(i);
                label1.Text = allebilder.ElementAt<string>(i);
            }

            else 
            {
                if (i == 0) // because 0 is already added 
                {
                    i = rnd.Next(allebilder.Count<string>());
                }
                else
                {
                    wdhlist.Add(i);
                    i = rnd.Next(allebilder.Count<string>());
                }
            }
        }

        private void btn1_Click(object sender, EventArgs e)
        {
            i = rnd.Next(allebilder.Count<string>());
            wdhlist.Add(i);

            if (wdhlist.Count() >= allebilder.Count<string>())
            {
                wdhlist.Clear();
            }

            else
            {
                if (wdhlist.Contains(i))
                {
                    i = rnd.Next(allebilder.Count<string>());
                    wdhlist.Add(i);
                }

                else
                {
                    if (allebilder.ElementAt<string>(i).EndsWith(".jpg") || allebilder.ElementAt<string>(i).EndsWith(".jpeg") || allebilder.ElementAt<string>(i).EndsWith(".png") || allebilder.ElementAt<string>(i).EndsWith(".gif") || allebilder.ElementAt<string>(i).EndsWith(".bmp"))
                    {
                        if (allebilder.ElementAt<string>(i) == null)
                        {
                            MessageBox.Show("Nope");
                        }

                        else
                        {
                            label1.Text = allebilder.ElementAt<string>(i);
                            pBox1.ImageLocation = allebilder.ElementAt<string>(i);
                        }
                    }
                    else
                    {
                        i = rnd.Next(allebilder.Count<string>());
                        wdhlist.Add(i);
                    }
                }
            }
        }

        private void btn1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btn1_Click(sender, e);
            }
        }

        private void btn2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Version 0.3\n\nUse: Copy .exe in a folder with pictures\nSupports .jpg, .gif, .png and .bmp\n\nProgram by Fabian Schmidt\nIcon by Aleksandra Wolska\n(https://www.iconfinder.com/iconsets/49handdrawing)");
            btn1.Focus();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您需要形成图像的列表文件名。然后形成一个索引列表 - 从0到列表中的图像数量。

List<int> numberList = Enumerable.Range(0, imagesList.Count).ToList();

然后你得到0到该numberList.Count的随机数

int randomValue = numberList[rnd.Next(0, numberList.Count)];

使用后,将其从numberList

中删除
DoSomeThingWithImage(imagesList[randomValue]);
numberList.Remove(randomValue);

所以你会有非重复的随机图像,直到它们都没有出现。然后重新做这个。 希望有所帮助。

答案 1 :(得分:0)

您可以按随机顺序创建图像序列,然后在完全使用列表时重新创建序列

private Random rnd = new Random();
private IEnumerable<string> GetImagesInRandomOrder(){
    return Directory.EnumerateFiles(pfad).OrderBy(x => rnd.Next());
}

private IEnumerator<string> randomImages = 
          Enumerable.Empty<string>.GetEnumerator();

private string GetNextImage(){
       if(!randomImages.MoveNext()){
          randomImages = GetImagesInRandomOrder().GetEnumerator();
          if(!randomImages.MoveNext()){ 
              throw new InvalidOperationException("No images"); 
          }   
       }
       return randomImages.Current;
}

然后你会这样使用它:

DoSomeThingWithImage(GetNextImage());