【问题标题】:C# Checking if there is same random value in the array or notC#检查数组中是否有相同的随机值
【发布时间】:2018-10-21 17:58:57
【问题描述】:

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

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

5 从 textbox1 输入,10 从 textbox2 输入。总和当然是 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 的情况下完成的(我的意思是只包含部分)。也没有工作。我写在“其他”;

 array[i] += number; 

它也没有工作。

如果您能帮助我,我将不胜感激。提前致谢。

【问题讨论】:

    标签: c# arrays random


    【解决方案1】:

    用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,但是在上面的代码中不需要检查,我们只需要所有的数字,然后我们就可以随机播放了。

    【讨论】:

      【解决方案2】:

      您可以尝试使用do...while 而不是for loop

      Random.Next获取0c - 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]);
      }
      

      【讨论】:

        【解决方案3】:

        您基本上需要对数据进行洗牌。创建一个包含所有值的集合:

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

        现在随机排序

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

        现在您可以将temp 添加到您的listBox

        或者,作为单行:

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

        【讨论】:

        • 注意OrderByO(n log n),洗牌可以在O(n)完成。
        • @Caramiriel 是的,你是对的。 Fisher–Yates 算法需要 O(n) 操作。但是当我们处理小集合时OrderBy 工作正常
        猜你喜欢
        • 1970-01-01
        • 2018-08-18
        • 2012-05-20
        • 2022-12-20
        • 1970-01-01
        • 2014-05-15
        • 1970-01-01
        • 1970-01-01
        • 2014-02-03
        相关资源
        最近更新 更多