很多人认为这是简单的Magic Number,其实这背后有内在的原因,这三个数字并不是随便乱选出来的。
入门级的选择标准
这种伪随机数生成器叫做线性同余生成器(LCG, Linear Congruential Generator),几乎所有的运行库提供的rand都是采用的LCG,形如:
生成的伪随机数序列最大周期m,范围在0到m-1之间。要达到这个最大周期,必须满足
c与m互质a - 1可以被m的所有质因数整除如果m是4的倍数,a - 1也必须是4的倍数以上三条被称为Hull-Dobell定理。
作为一个伪随机数生成器,周期不够大是不好意思混的,所以这是要求之一。
可以看到,a=9301, c = 49297, m = 233280这组参数,以上三条全部满足。
进阶级的选择标准
要在伪随机数生成器界混,仅仅入门是不够的。
从工程的角度来讲,
的值要(在合理的范围内)足够小,以避免溢出的问题。
从安全(实用)性的角度来讲,还要满足良好的随机性,这一点可以通过Knuth's Spectral Test来评估(见[2][3]),要通过2,3,4,5以及6维的Spectral Test才行。