【问题标题】:Why does my loop produce the same random number unless I pause at the end of every iteration? [duplicate]为什么我的循环会产生相同的随机数,除非我在每次迭代结束时暂停? [复制]
【发布时间】:2018-11-26 03:44:26
【问题描述】:

为什么这会起作用并根据SIZE 产生不同的随机数?

for (int index = 0; index < SIZE; index++)
{
    Random rand = new Random();
    numbersArray [index] = rand.Next(0, 100);
    MessageBox.Show(index.ToString());
}

然而这会产生与SIZE 相同的数字?

for (int index = 0; index < SIZE; index++)
{
    Random rand = new Random();
    numbersArray [index] = rand.Next(0, 100);
}

我唯一的猜测是当程序暂停时Random 对象会被刷新?

【问题讨论】:

  • 当问这样的问题时,向我们展示你的输出是什么(或者至少是它的样子)很有用。您的第一个输出应该类似于0, 1, 2, …(在消息框中!)。你的第二个应该是随机的,但谁知道,你正在一个非常紧密的循环中创建 System.Random 的新实例。对于它的价值,您可以使用 Debug.WriteLine 从 Windows 窗体应用程序输出有点分类的控制台输入(它将显示在输出窗格中)
  • 在发布问题之前查阅文档总是有帮助的。这个问题在documentation

标签: c# loops for-loop random


【解决方案1】:
    for (int index = 0; index < SIZE; index++)
    {
        Random rand = new Random();
        numbersArray [index] = rand.Next(0, 100);
        //index is not the actual random number!
        MessageBox.Show(index.ToString());
    }

在这段代码中,您向自己展示了数组的索引号,而不是实际的随机数,也许这就是您没有得到预期结果的原因。 ;)

【讨论】:

  • 为什么人们不赞成我的回答?我不明白它有什么问题,你能解释一下我做错了什么吗?谢谢!
  • 我没有对你投反对票,但是如果你再次阅读 OP 所说的内容 - 与没有 MessageBox 的代码相比,带有 MessageBox 的代码会生成不同的随机数。我认为他正在使用MessageBox 作为暂停循环的一种方式,这可以解释这种行为。
  • @IlianPinzon 哦,我明白了,我以为 MessageBox 的东西是输出随机数。但是,如果 OP 实际上是在问为什么暂停循环会使数字不同,那么“重复”标记实际上是错误的,不是吗?
  • 我认为是正确的。暂停循环将创建一个具有不同种子的Random 对象。如果没有暂停,所有/大部分已创建的 Random 对象将具有相同的种子。
  • 无论有没有暂停,都会创建Random 对象。随机数生成器的种子使用计算机的时钟。如果循环非常快,将使用相同的种子(与时钟相同的时间)。检查重复的问题并阅读答案,那里的解释更详细。 :)
猜你喜欢
  • 2016-03-29
  • 2012-03-04
  • 1970-01-01
  • 2020-12-20
  • 2016-12-20
  • 2014-08-22
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多