为什么不创建一个“真正的”随机数?

时间:2012-10-09 00:48:18

标签: c# random numbers

  

可能重复:
  Random number generator only generating one random number

我试图创建一个循环来在列表框中创建和输出5个随机数。基本上它输出相同的随机数5次而不是5次不同的随机数。当我使用断点并通过代码时,它实际上生成了5个数字。那为什么它只输出第一个答案呢?谢谢。 (这不是整个项目,但我需要先让它工作。)

    public string Numbertext1;
    public string Numbertext2;       
    public int GeneratedNumbers;
    public int Average = 0;
    public int TotalSum = 0;
    public int TotalCalcs = 0;
    public int Counter = 0;

    private void btnRandomise_Click(object sender, EventArgs e)
    {
        Numbertext1 = txtNum1.Text;
        int Number1;
        int.TryParse(Numbertext1, out Number1);
        Numbertext2 = txtNum2.Text;
        int Number2;
        int.TryParse(Numbertext2, out Number2);

        do
        {

            Random num = new Random();
            int number = num.Next(Number1, Number2);
            lbNumbers.Items.Add(Convert.ToString(number));
            Counter++;
        }
        while (Counter < 5);
        {
            TotalCalcs++;
            Counter = 0;
        }


    }
}
}

4 个答案:

答案 0 :(得分:6)

您需要在全局级别初始化num变量。它一遍又一遍地使用相同的种子。

把这个:Random num = new Random();放在最初初始化其他所有内容的顶部。然后从方法中删除它。

答案 1 :(得分:3)

这是因为您在紧密循环中创建了一个新的Random实例,因此种子编号将是相同的。 Random类并非真正随机(在数学意义上),因此您应该更改种子或使用它的一个实例。使用其他变量将Random num = new Random();移至顶部。

答案 2 :(得分:2)

因为你没有给随机数生成器充分播种。

生成器有一个算法,如果你只是在没有播种的情况下创建它,那么每次你的数字都是相同的。 To quote from MSDN

  

默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集。

要解决此问题,请使用允许您指定种子的其他构造函数 - 在MSDN上有good example这个。

答案 3 :(得分:0)

Random类实例化是时间相关的。通过非常快速的循环,您每次都创建相同的对象,因此您可以反复获得相同的值。您需要在循环外部移动实例化,以便在调用Next()时获得新数字。

这也是使用断点检查值时“工作”的原因。您创建的随机对象将具有不同的参考时间,因此会有所不同。