初始值取
x0=1 ,生成的序列为
{1,6,7,4,5,2,3,0,1,6,7,⋯} ,周期
T=8=M=8。
从上述的例子中,我们发现,不同的
a,c,M取值,序列周期也不相同。若
T<M 时,则序列的取值种类不能遍历
0∼M−1,也即在
0∼M−1 中取值不是均匀等可能的,因此需要选取使得
T=M (也即满周期)的取值。那么什么样的取值会使产生的这样的序列呢?满足以下三个条件的参数取值,能够使得序列达到满周期:
(1)c 与 M 互素,
(2) 对于M的任意素因子
P,a−1能被
P整除,(3) 如果
4 是 M 的因子,则
a−1 能被
4 整除。具体的证明可参考该文献。由于在实际的应用过程的中,使用得随机数的数量很大,因此周期(M)也需要尽可能的大,同时为了利用计算机整数溢出yuanl原理简化计算,
M 的取值通常为 2L(
L 为计算机整数的尾字长数)。由条件(1)可知,在
M=2L 时,
c 只能为通常的取值为奇数 c=2β+1,由条件
(2) 和
(3) 可知,
4α+1 是
a 合理的取值。 同时,由序列中前后两项自相关系数的近似公式:
ρ(1)≈1a−6caM(1−cM)
可知,
a 应该尽可能大,但是应小于 M。
2. 乘同余发生器
c=0 的线性同余发生器为乘同余发生器,其递推公式转变成:
xn=axn−1(modM);a>0,M>0n=1,2,⋯
从公式可知,由于
xi≠0,所以其产生的序列不能达到满周期(
M),其可能的最大周期为 M−1。那么
a 和 M 的取什么样的值能够使得序列的周期足够的接近甚至达到
M−1 呢?由于当
(M,a)≠1 或
(M,x0)≠1 时,发生器产生的序列会退化到
xi=0 的状态,也即周期为
1,研究的意义不大,在以下的讨论中不予考虑。通过同余的传递性,很容易就能证明序列的周期为满足aV≡1(modM)的最小整数
V,也即 a 对
M 的阶数。因此取合适的值使得 V=M−1 ,序列就能达到可能的最大周期。
Hutchinson提出了一种取值方式:
M 为小于2L 的最大素数,取
a 为 M 的素元。这种取值方式形成的发生器也称为素数模乘同余发生器,该类型的发生器是目前使用最广泛的随机数发生器。素数模乘同余发生器面临两个问题:(1)由于
M 不是 2L 的形式,不能利用计算机的溢出原理来减少除法运算,(2)如何求得
M 的素元 a。1969年Payne,Rabang和Bogyo提出的“模拟式除法”基本解决了问题(1),问题(2)涉及很多数论的知识,其仍有很多值得探究的价值。除了素数模乘同余发生器,前人的研究已经给出了其他两种种类型的取值,但是周期都与
M−1 相差较大:(1) 当
M 为2L(L≥4),
x0 为奇数,
a≡3或5(mod8) 时, 序列的周期为
2L−2 ;(2)当
M 为10s(s≥5),
x0 不是2或5的倍数时,
a 取合适的值能够使得序列的周期达到 5∗10s−2 。
发表评论 取消回复