我正在实现一个任意位随机数生成器(在 [)) 并且还想确保生成器始终生成唯一的数字,直到生成所有可能的数字,所以我使用 LCG 实现它(我也考虑过线性反馈移位寄存器方法,但它不能缩放到任意位数,因为依赖在原始多项式上)。
算法如下:
- 创建数组长度
- 使用随机位填充数组。这个数组是
- 生成第二个长度-大批 () 并填写三个最低位(确保可以被) 并使用随机位填充其他单元格。
- 生成第三个长度-大批 () 并将最低位设置为(其他单元格随机),所以这个数组是奇数且相对质数.
- 生成随机数(mod 是通过在加法和乘法运算中仅保留位)。
结果,这个 LCG 的重复周期总是最大的,但是,我发现第个最低位的重复周期总是。例如,最低位为,次低位为,依此类推。这让我想知道我的实现是否有问题,或者实际上是 LCG 的弱点。我在 C 中测试了并没有找到这种模式,所以我猜这个问题来自我的实现。任何人都可以给我一些建议吗?谢谢。1,0,1,0,...1,0,0,1,1,0,0,1,...rand