我通常以下列方式生成随机内容:
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));
}
哪个更随机或者它们是相同的?
答案 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对象提供相同的种子值会导致每个实例产生相同的随机数序列。
如果您的应用程序需要不同的随机数序列,请使用不同的种子值重复调用此构造函数。
答案 5 :(得分:0)
我建议你使用第一个beacuase你的两个实现更不一样 但第二个可以创建colliosions(相同的键)。
答案 6 :(得分:0)
第二种方式可以创建相同的输出。