C#检查数组中是否存在相同的随机值

时间:2018-10-21 17:58:58

标签: c# arrays random

我想检查数组中是否有相同的值,如标题中所述。如果有的话,我想传递该值并检查另一个随机值以添加到列表框。

在我的表单中,有2个文本框,1个列表框和1个按钮。单击按钮时,列表框必须显示最多为textbox1和textbox2之和的随机数。例如;

从文本框1输入

5,从文本框2输入10。总和当然是15,列表框必须显示15个随机数,但是这些数字必须彼此不同。

我写了类似的东西,并使用Contains方法检查是否有相同的值。但是程序冻结了,没有给出任何错误。

    int a, b;
    Random rnd = new Random();
    int[] array;

    private void button1_Click(object sender, EventArgs e)
    {
        a = Convert.ToInt32(textBox1.Text);
        b = Convert.ToInt32(textBox2.Text);
        int c = a + b;
        array = new int[c];

        for (int i = 0; i < array.Length; i++)
        {
            int number = rnd.Next(c);

            foreach(int numbers in array)
            {
                if (array.Contains(numbers))
                {
                    i--;
                }

                else
                {
                    array[i] = number;
                    listBox1.Items.Add(array[i]);
                }
            }              
        }

我也这样做了,没有foreach(只包含我要说的部分)。也没有用。我写的是“ else”;

 array[i] += number; 

它也不起作用。

如果您能帮助我,我将不胜感激。预先感谢。

3 个答案:

答案 0 :(得分:3)

使用while循环代替for循环:

int = 0;
while(i<c)
{
    int random rnd.Next(c);
    if(!array.Contains(random))
         array[i++] = random;
}

您还可以创建一个1-15的数字列表,然后对其进行随机播放(因为您的随机函数将仅创建1-15的随机数字,只是随机的):

array = Enumberable.Range(0,c).OrderBy(x => rnd.Next()).ToArray(); 

上面的代码要快得多,因为假设我们已经生成了14个随机数,只剩下一个数字(例如5个),它必须经过几次循环,以便最终生成的随机数等于5,但是在上面的代码中,无需检查,我们只有所有数字,然后将其洗牌。

答案 1 :(得分:2)

您可以尝试使用do...while代替for loop

Random.Next0c - 1取值,因此rnd.Next(c + 1);需要加上1,否则循环不会停止。

var array = new int[c];
int number;  

for (int i = 0; i < array.Length; i++)
{
    do
    {
        number = rnd.Next(c + 1);

    } while (array.Contains(number));
    array[i] = number;
    listBox1.Items.Add(array[i]);
}

答案 2 :(得分:1)

基本上,您需要重新整理数据。创建具有所有值的集合:

var temp = Enumerable.Range(0, c);

现在随机订购

temp = temp.OrderBy(_ => rnd.Next());

现在您可以将temp添加到listBox

或者,作为单行:

listBox1.Items.AddRange(Enumerable.Range(0, c).OrderBy(_ => rnd.Next()));