Random 寻找一个清晰简洁的网页,解释为什么随机数的低位通常不是那么随机的

Random 寻找一个清晰简洁的网页,解释为什么随机数的低位通常不是那么随机的,random,bits,Random,Bits,我正在创建一个内部的“每个开发人员都应该知道”wiki页面 我看到了许多关于rand()%N的讨论,但没有一个网页解释所有这些 例如,我想知道这个问题是只有C和Linux特定的,还是它也适用于Windows,C++,。Java、.Net、Python、Perl 请帮我弄清这件事的真相。还有,这些数字的非随机性如何?谢谢大家! 检查,这可能是大多数内置随机数生成器使用的算法 向下滚动,查找以“LCG的另一个问题是生成序列的低阶位的周期要短得多…”开头的段落,以便深入了解rand()%N 我没有网页

我正在创建一个内部的“每个开发人员都应该知道”wiki页面

我看到了许多关于
rand()%N
的讨论,但没有一个网页解释所有这些

例如,我想知道这个问题是只有C和Linux特定的,还是它也适用于Windows,C++,。Java、.Net、Python、Perl

请帮我弄清这件事的真相。还有,这些数字的非随机性如何?谢谢大家!

检查,这可能是大多数内置随机数生成器使用的算法


向下滚动,查找以“LCG的另一个问题是生成序列的低阶位的周期要短得多…”开头的段落,以便深入了解
rand()%N

我没有网页可供您参考,但我可能会有一个“信封背面”的解释,这会有所帮助。简单随机数生成器的工作方式是遵循以下步骤

  • 使用生成的最后一个编号
    n
    或种子编号
  • 把那个数字乘以一个特别大的数字
  • 添加另一个特别大的数字
  • 把它除以第三个特别大的数字,然后扔掉剩下的
  • 返回结果
  • 现在,如果你想一想除了第4步以外的所有步骤中会发生什么,你正在做的是只有低位可以改变结果低位的操作。加上1001和100…00001将以…02结束(哈哈,虽然我说的是基数2,但实际上这些数字都是以12为基数的),不管计算的高端是什么。类似地,当你乘以它时,不管发生什么,它都会以1结尾

    在顶端也有一个类似的问题,10亿乘以10亿将永远支配着数百个凋谢数字的贡献。这表明了一个事实,即中间是好事发生的地方。很多位在这里相互作用——高、中、低

    这就是除法步骤的目的,它切断了结果中没有那么多交互的底部块。顶部的块通常不会被切掉,因为当乘法不再适合机器字时,计算机会删除上面的位

    最后,虽然截断点有些随意,你可以比设计算法的人更挑剔,但还是要多砍掉一些位

    对于你来说,问题是他们有多糟糕,他们真的很糟糕。看到这一点的最简单方法是将单个数字分组成元组并绘制它们的图形。因此,如果你有随机数
    a,b,c,d,…
    graph
    (a,b),(c,d),…
    ,然后查看结果。这被称为光谱测试,兰德很漂亮地失败了。这一个我有一个尝试的链接