为什么我的线性同余生成器会生成低质量的随机数?

计算科学 随机数生成
2021-12-15 18:40:39

我正在实现一个任意位随机数生成器(在 [0,2n)) 并且还想确保生成器始终生成唯一的数字,直到生成所有可能的数字,所以我使用 LCG 实现它(我也考虑过线性反馈移位寄存器方法,但它不能缩放到任意位数,因为依赖在原始多项式上)。

算法如下:

  1. 创建数组长度n
  2. 使用随机位填充数组。这个数组是X0
  3. 生成第二个长度-n大批 (a) 并填写三个最低位1,0,1(确保a1可以被4) 并使用随机位填充其他单元格。
  4. 生成第三个长度-n大批 (c) 并将最低位设置为1(其他单元格随机),所以这个数组是奇数且相对质数m=2n.
  5. 生成随机数(mod 是通过在加法和乘法运算中仅保留位)。Xn=(aXn1+c)modmn

结果,这个 LCG 的重复周期总是最大的,但是,我发现第个最低位的重复周期总是例如,最低位为,次低位为,依此类推。这让我想知道我的实现是否有问题,或者实际上是 LCG 的弱点。在 C 中测试了并没有找到这种模式,所以我猜这个问题来自我的实现。任何人都可以给我一些建议吗?谢谢。i2i1,0,1,0,...1,0,0,1,1,0,0,1,...rand

1个回答

这就是 LCG 的工作原理。

您可以通过简单地对输出中的某些低位进行异或运算来减少应用程序的问题(但不要将此修改后的输出用作生成器循环的下一个输入)。这将保留计数器的整个周期,但它将低位的周期提高到与高位的周期相同。

这不是一个很好的调整,作为 PRNG 仍然存在重大缺陷,但它可以以便宜的方式完成基本工作。你可以通过乘以另一个奇数常数并做另一个移位异或来使它变得更好,但这取决于你真正需要什么以及你想花多少时间在上面。