【问题标题】:Instantiating Random in or out of the loop在循环内或循环外实例化 Random
【发布时间】:2011-11-03 09:12:19
【问题描述】:

我通常通过以下方式生成随机的东西:

Random random = new Random(DateTime.Now.Millisecond);

for (int i = 0; i < 100; i++)
{
    Console.WriteLine(random.Next(0, 100));
}

我想知道如果我将 Random 实例化放在循环中是否有区别:

for (int i = 0; i < 100; i++)
{
    Random random = new Random(DateTime.Now.Millisecond);

    Console.WriteLine(random.Next(0, 100));
}

哪个更随机或相同?

【问题讨论】:

标签: c# random


【解决方案1】:

第一个(即在循环之外)更有效且更随机,因为第二个在很短的时间内创建了大量 Random 实例,这将导致多个实例具有相同的种子(即相同的 Millisecond),其中turn 意味着一遍又一遍地生成相同的随机数。

来自MSDN

随机数生成从种子值开始。如果一样 种子重复使用,生成同一系列的数字。

【讨论】:

    【解决方案2】:

    在循环之外,基于本文档中的示例:
    http://msdn.microsoft.com/en-us/library/system.random.aspx

    【讨论】:

    • 喜欢这行Random类的无参数构造函数默认使用系统时钟来生成它的种子值
    【解决方案3】:

    第一个更随机,第二个最终可能会多次写入相同的值(与同一毫秒内的迭代次数一样多)。

    “随机”并不是真正的随机,它使用一种算法从前一个值中计算出下一个值。起始值(“种子”)只是序列中的第一个值。所以相同的起始值导致相同的序列。

    【讨论】:

      【解决方案4】:

      您应该重复使用 Random 变量。在您的第二个示例中,您通常会得到相同的结果。

      【讨论】:

        【解决方案5】:

        后者产生更多的随机数。根据 MSDN,您提供的值(毫秒)用于计算伪随机数序列的起始值。如果指定负数,则使用该数字的绝对值。

        因此,为不同的 Random 对象提供相同的种子值会导致每个实例产生相同的随机数序列。

        如果您的应用程序需要不同的随机数序列,请使用不同的种子值重复调用此构造函数。

        More...

        【讨论】:

          【解决方案6】:

          我建议您使用第一个,因为您的两个实施方式不太相同 但第二个可能会产生碰撞(相同的键)。

          【讨论】:

            【解决方案7】:

            第二种方式可以创建相同的输出。

            【讨论】:

              猜你喜欢
              • 2014-10-16
              • 1970-01-01
              • 2015-04-10
              • 1970-01-01
              • 1970-01-01
              • 2013-06-24
              • 2021-10-28
              • 2016-12-31
              • 2021-04-14
              相关资源
              最近更新 更多