0

可能重复:
随机数生成器仅生成一个随机数

我试图创建一个循环来在列表框中创建和输出 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

4 回答 4

6

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

把这个 :Random num = new Random(); 放在你初始化其他所有东西的顶部。然后将其从您的方法中删除。

于 2012-10-09T00:49:54.557 回答
3

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

于 2012-10-09T00:50:57.147 回答
2

因为您没有为随机数生成器提供足够的种子。

生成器有一个它遵循的算法,如果你只是创建它而不播种它,那么你的数字每次都将是相同的。引用 MSDN

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

要解决此问题,请使用允许您指定种子的其他构造函数 - MSDN 上有一个很好的示例。

于 2012-10-09T00:50:57.000 回答
0

Random类实例化是时间相关的。通过一个非常快速的循环,您每次都在创建相同的对象,因此您会一遍又一遍地获得相同的值。您需要将实例移到循环之外,以便在调用 Next().

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

于 2012-10-09T00:58:04.753 回答