通过我的3卷TAOCP,我无法找到短随机序列的来源:
// Seed always in 1..0x10000
Seed = (Seed * const) % 0x10001
还有一个算法和可能的MIX程序来验证const,以便返回所有2 ^ 16个值。至少那是我记得的。同样在一般区域中,上述递归是有效的,因为(2 ^ 16)+1是素数但是唉,(2 ^ 32)+1和(2 ^ 64)-1都不是素数。
FWIW,用iconst = 1 / const(mod 0x10001)替换const会以相反的顺序生成序列。即const * iconst%0x10001 = 1
答案 0 :(得分:0)
该算法是linear congruential generators(LCG)的变体,称为Prime模数乘法线性同余生成器(PMMLCG - 参见Law的“Simulation Modeling and Analysis,5e”p.400),有时也被称为{{{ 3}}。我提供的两个链接都提供了通用参数化,第一个链接给出了选择参数的规则,这些参数将给出一个完整的循环。然而,拥有一个完整的循环并不是拥有一个好的生成器的充分条件,因为IBM在现在臭名昭着的Lehmer generator中发现了它。
我强烈建议你只使用经过充分测试的算法,这很难做到这一点。目前广泛使用的RANDU比任何LCG都要好得多。