如何随机是Random.Next()?
-
22-09-2019 - |
题
我已经做在随机类的一些测试和我已经使用以下代码:
while (x++ <= 5000000)
{
y = rnd.Next(1, 5000000);
if (!data.Contains(y))
data.Add(y);
else
{
Console.WriteLine("Cycle {2}: Repetation found for number {0} after {1} iteration", y, x, i);
break;
}
}
我不停改变RND最大限制(即5000000)和I改变迭代次数和我得到了以下结果:
1) if y = rnd.Next(1, 5000) : The average is between 80 to 110 iterations
2) if y = rnd.Next(1, 5000000) : The average is between 2000 to 4000 iterations
3) if y = rnd.Next(1, int.MaxValue) : The average is between 40,000 to 80,000 iterations.
为什么会出现这些平均值,即总分10次我检查每个值,的80%的时间出现此平均范围内。我不认为我们可以接近调用它是随机的。
我能做些什么来获得相当的随机数。
解决方案
您没有测试对于周期。您正在测试需要多长时间让你以前吃过的随机数。这是的完全不同的的。你的数字是当场就测试需要多长时间让你收到了一个随机数。看在维基百科下“生日悖论”的一定数目的迭代之后得到一个冲突的概率的图表。
无独有偶,上周我写了这个确切的主题一个博客文章。它会去住上3月22日; 看到我的博客一>然后获取详细信息。
如果你想测试什么是伪随机数发生器的周期长度,那么你需要寻找不的数量的你已经收到,而是一个的漫长的确切顺序的数字,你已经收到了。有许多有趣的方式来做到这一点,但它可能容易,我只是告诉你:随机的周期长度是数十亿,因此你不太可能能够编写发现其实是一个程序。你不得不存储的很多的数量。
然而,周期长度是不是一个伪随机数发生器的质量的唯一标准。请记住,是的PRNG的不是随机的,他们的预测的的,因此,你必须非常小心你的度量“随机性”是什么样的想法。
给我们更多的细节:你为什么关心如何“随机”随机是什么?什么应用程序,你使用它,你在乎吗?哪些方面的随机性对你很重要?
其他提示
您的假设随机性是更好,如果不重复的数字。这是不正确的。
实时随机性不具有存储器。当你拿起的下一个号码,再次获得相同数量的几率一样高范围内的任何其它号码。
如果你滚骰子,并得到一个六,然后再掷骰子,没有少机会再次拿到6分。如果你碰巧拿到连续两个六点,这并不意味着骰子被打破。
在Random类它的随机性当然不是完美的,但是这是你的测试显示没有什么。它只是显示了penomenon,你得到的每ranom数生成器,即使实际上创建了真正的随机数,而不仅仅是伪随机数。
您通过重复对判断随机性,这对于随机性最好的测试。你看到的重复是类似于生日悖论: http://en.wikipedia.org/wiki/Birthday_problem 时,其中一个重复事件能够以较小的样本大小,如果你不寻找一个特定的事件发生。
一个计算机不能产生一个真正的随机数。 如果你需要一个真正的随机数(大卫给你点NET架构的最佳选择) 需要一个外部随机源。