在循环中实例化随机

时间:2011-11-03 09:12:19

标签: c# random

我通常以下列方式生成随机内容:

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));
}

哪个更随机或者它们是相同的?

7 个答案:

答案 0 :(得分:4)

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

来自MSDN

  

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

“随机”并非真正随机,它使用算法计算前一个值的下一个值。起始值('seed')只是序列中的第一个值。因此相同的起始值导致相同的序列。

答案 3 :(得分:0)

您应该重用Random变量。在你的第二个例子中,你经常得到相同的结果。

答案 4 :(得分:0)

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

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

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

More...

答案 5 :(得分:0)

我建议你使用第一个beacuase你的两个实现更不一样 但第二个可以创建colliosions(相同的键)。

答案 6 :(得分:0)

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