可能的重复:
为什么我的随机数生成器在 C# 中不是随机的? https://stackoverflow.com/questions/932520/why-does-it-appear-that-my-random-number-generator-isnt-random-in-c
如何使用 C# 生成真正的(非伪)随机数? https://stackoverflow.com/questions/1234094/how-can-i-generate-truly-not-pseudo-random-numbers-with-c
我创建了一个骰子游戏,其中骰子基于百分位数 1-100。
public static void Roll()
{
Random rand = new Random((int)DateTime.Now.Ticks);
return rand.Next(1, 100);
}
但我不认为这是基于当前时间的真正随机。
If I do
for (int i = 0; i < 5; i++)
{
Console.WriteLine("#" + i + " " + Roll());
}
它们都是相同的值,因为DateTime.Now.Ticks
没有改变,它播种的数量相同。
我在想,如果种子由于当前时间而相同,我可以生成一个新的随机种子,但感觉不像是诚实的“重新滚动”
我应该怎么做才能尝试复制接近真实/诚实的掷骰子?我应该使用RNGCryptoServiceProvider
类来生成卷?
DateTime.Now.Ticks
分辨率只有约16毫秒 http://blogs.msdn.com/b/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx,所以如果你创建一个Random
在 16ms“时隙”内多次过载,它们都将被播种为相同的值,因此您将获得相同的序列。
初始化你的Random
在你的循环之外,以便单个Random
生成序列,而不是每次在循环内创建它,这可能会导致Randoms
被播种为相同的值,因此产生相同的序列。
Update
我之前的观点是默认构造函数已初始化Random
CPU 滴答数不正确,默认构造函数实际上使用环境.TickCount http://msdn.microsoft.com/en-us/library/system.environment.tickcount.aspx这是:
一个 32 位有符号整数,包含自上次启动计算机以来经过的时间量(以毫秒为单位)。
其分辨率仍然较低。如果您创建多个实例Random
它们可以快速连续地在同一时间段内轻松创建,因此具有相同的种子值,并创建相同的序列。创建单个实例Random
并使用它。
Update
除了您的评论之外,如果您希望跨多个线程生成随机序列,请参阅以下 Jon Skeet 文章,其中讨论了线程安全包装器:
https://codeblog.jonskeet.uk/2009/11/04/revisiting-randomness https://codeblog.jonskeet.uk/2009/11/04/revisiting-randomness
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)