我一直在对Random类进行一些测试,我使用了以下代码:
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 max limit(即5000000),我改变了迭代次数,得到了以下结果:
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%的时间都在这个平均范围内。我不认为我们可以把它称为随机。
我可以做些什么来获得相当随机的数字。
答案 0 :(得分:30)
您没有测试周期。您正在测试获取之前已有的随机数所需的时间。那是完全不同的。您的数据可用于测试获取之前的随机数所需的时间。在“生日悖论”下的维基百科中查看一定次数的迭代后获得碰撞概率的图表。
巧合的是,上周我写了一篇关于这个确切主题的博客文章。它将于3月22日上线; see my blog然后了解详情。
如果您要测试的是伪随机数生成器的周期长度,那么您需要查找以前没有的数字,而是您之前拥有的数字的冗长精确序列。有很多有趣的方法可以做到这一点,但我可能更容易告诉你:Random的周期长度是几十亿,所以你不太可能编写一个发现这个事实的程序。您必须存储批次的数字。
但是,周期长度不是伪随机数发生器质量的唯一衡量标准。请记住,PRNG 不是随机的,它们是可预测的,因此您必须非常仔细地考虑“随机性”的指标。
给我们更多细节:你为什么要关心“随机”随机是怎样的?您使用它的应用程序是什么?随机性的哪些方面对您很重要?
答案 1 :(得分:15)
如果数字不重复,您假设随机性更好。事实并非如此。
真正的随机性没有记忆。当您选择下一个号码时,再次获得相同号码的机会与该范围内的任何其他号码一样高。
如果你掷骰子并获得6分,然后再次掷骰子,那么再次获得6分的机会就不小了。如果你碰巧连续得到两个六,这并不意味着骰子被打破了。
随机类中的随机性当然不是完美的,但这不是你的测试所揭示的。它只是显示了每个ranom数字生成器得到的一个现象,即使实际创建了真正的随机数而不仅仅是伪随机数。
答案 2 :(得分:3)
您正在通过重复对来判断随机性,这不是随机性的最佳测试。您看到的重复类似于生日悖论:http://en.wikipedia.org/wiki/Birthday_problem,如果您没有寻找特定事件,则可以使用小样本重复事件。
答案 3 :(得分:2)
根据http://msdn.microsoft.com/en-us/library/system.random.aspx
的文件生成加密安全 适合创建的随机数 随机密码,例如,使用a 来自的类 System.Security.Cryptography..::.RandomNumberGenerator 如 System.Security.Cryptography..::.RNGCryptoServiceProvider.
答案 4 :(得分:2)
计算机无法生成实际随机数。 如果你需要一个真正的随机数(David给你点网框架的最佳选择) 你需要一个外部随机源。