Bha*_*kar 10 c# random birthday-paradox
我一直在对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;
}
}
Run Code Online (Sandbox Code Playgroud)
我一直在改变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.
Run Code Online (Sandbox Code Playgroud)
为什么我得到这些平均值,即我检查每个值的10次,80%的时间都在这个平均范围内.我不认为我们可以把它称为随机.
我该怎么做才能得到一个相当随机的数字.
Eri*_*ert 30
你没有测试周期.您正在测试获取之前已有的随机数所需的时间.那是完全不同的.您的数据可用于测试获取之前的随机数所需的时间.在"生日悖论"下的维基百科中查看在一定次数的迭代后获得碰撞的概率图表.
巧合的是,上周我写了一篇关于这个确切主题的博客文章.它将于3月22日上线; 然后看我的博客了解详情.
如果你想要测试的是伪随机数发生器的周期长度,那么你需要寻找的不是你以前的数字,而是你之前已经拥有的一个冗长的精确数字序列.有很多有趣的方法可以做到这一点,但我可能更容易告诉你:Random的周期长度是几十亿,所以你不太可能编写一个发现这个事实的程序.你必须存储很多数字.
但是,周期长度不是伪随机数发生器质量的唯一衡量标准.请记住,PRNG 不是随机的,它们是可预测的,因此您必须非常仔细地考虑您的"随机性"指标.
给我们更多细节:你为什么要关心"随机"随机是怎样的?您使用它的应用程序是什么?随机性的哪些方面对您很重要?
Guf*_*ffa 16
您假设如果不重复数字,则随机性更好.事实并非如此.
真正的随机性没有记忆.当您选择下一个号码时,再次获得相同号码的机会与该范围内的任何其他号码一样高.
如果你掷骰子并获得6,然后再次掷骰子,再次获得6的机会也就不小了.如果你碰巧连续得到两个六,这并不意味着骰子被打破了.
随机类中的随机性当然不是完美的,但这不是你的测试所揭示的.它只是显示了每个ranom数字生成器得到的一个现象,即使实际创建了真正的随机数而不仅仅是伪随机数.