随机是Random.Next()?

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 不是随机的,它们是可预测的,因此您必须非常仔细地考虑您的"随机性"指标.

给我们更多细节:你为什么要关心"随机"随机是怎样的?您使用它的应用程序是什么?随机性的哪些方面对您很重要?

  • @Zano:是的,我立刻写了一大堆文章,然后让他们每周上场两次.我在任何时候都要提前两个月.Raymond Chen每周发布五到十次,并且在他的队列中有几年*的价值; 我不知道他是怎么做到的! (6认同)

Guf*_*ffa 16

您假设如果不重复数字,则随机性更好.事实并非如此.

真正的随机性没有记忆.当您选择下一个号码时,再次获得相同号码的机会与该范围内的任何其他号码一样高.

如果你掷骰子并获得6,然后再次掷骰子,再次获得6的机会也就不小了.如果你碰巧连续得到两个六,这并不意味着骰子被打破了.

随机类中的随机性当然不是完美的,但这不是你的测试所揭示的.它只是显示了每个ranom数字生成器得到的一个现象,即使实际创建了真正的随机数而不仅仅是伪随机数.