LSB 位的随机性较低吗?它是如何工作的?用 C 编写的 rand 的最佳 LCG 实现是什么?

Are LSB bits less random? how does it work? And what is the best LCG implementation for rand written in C?

我最近在某处读到,具有较低有效位的值往往比具有较高有效位的值更不随机,有人可以更好地解释这一点吗?如果你能给我一些关于这个和随机数的论文,我将非常感激,只要它没有很多复杂的数学

这是对用于 C 库 rand() 函数的随机数生成器的质量通常很差的评论。它 returns 的数字应该是完全随机的——也就是说,如果你要求一百万个这样的数字,你将无法找到预测下一个的模式。

但是,如果 rand() 使用的算法不佳,则有可能在它 returns 的数字中找到模式,并预测未来的数字,或者预测未来数字的某些位。特别是,返回数字的低位(即表示 2^0、2^1、2^2、... 的位)比高位(表示 2^31 的位)更可预测, 2^30, ...)。例如,可能会说我们不知道下一个数字到底是什么,但它的低位有 60% 的可能性是 1,而不是 50%。

解决方法就是不使用内置的 rand() 函数,而是使用受信任的库或算法来生成随机数——永远不要“自己动手”(即编写自己的 RNG)。

这里有两件事在起作用。

  1. 首先是算法。伪随机数生成器 (PRNG) 输出的特定位是否比其他位“弱”取决于算法。例如,许多依赖线性递归的 PRNG(例如许多线性同余生成器)将产生其比特周期越短的输出,它们越不重要。当 so-called “模数”是 2 的幂(或更一般地,素数的幂)时,这往往是最糟糕的。下面引用的第一篇论文回顾了线性同余生成器的理论,第二篇论文展示了这种生成器的一个特殊现象。

    • Steele 和 Vigna,同余伪随机数生成器的计算简单、频谱良好的乘数,2020/2021。

    • Durst,使用线性同余生成器进行并行随机数生成,1989 年冬季模拟会议。

  2. 其次是C语言中rand(和srand)的性质,无论特定的rand实现使用何种算法都是如此.也许 rand 最严重的弱点是 rand 不能保证伪随机数必须遵循的特定分布。有关详细信息,请参阅:Why is the use of rand() considered bad?