一 点睛
线性同余法是一种使用很广泛的伪随机数生成器算法。然而,它并不能用于密码技术。
算法介绍如下:
假设我们要生成伪随机数列为R0、R1、R2...。首先,我们根据伪随机数的种子,用下列公式计算第一个伪随机数R0
R0=(A*种子+C)mod M
在这里,A、C、M都是常量,且A和C需要小于M
接下来,根据R0用相同的公式计算下一个伪随机数R1
R1=(A*R0+C)mod M
接下来我们再用同样的方法,根据当前的伪随机数Rn来计算下一个伪随机数R(n+1)
R(n+1)=(A*Rn+C)mod M
简而言之,线性同余法就是将当前的伪随机数值乘以A再加上C,然后将除以M得到的余数作为下一个伪随机数。在线性同余法中,最近一次生成的伪随机数的值就是内部状态,伪随机数的种子被用来对内部状态进行初始化。线性同余法的结构如下图:
二 实战
A=3
C=0
M=7
然后将6作为伪随机数的种子,根据线性同余法,生成伪随机数列的过程如下:
R0=(3*6+0)mod 7 =4
R1=(3*4+0)mod 7 =5
R2=(3*5+0)mod 7 =1
R3=(3*1+0)mod 7=3
以此类推,我们可以得到4、5、1、3、2、6、4、5、1、3、2、6...这样的伪随机数列。在这里,数列是以4、5、1、3、2、6的顺序不断循环的,因此周期为6。
由于伪随机数是除以M得到的余数,因此其范围必定是0~M-1,而且根据A、C、M的值,最终只能生成上述范围中的一部分值(因此周期会缩短)。例如,当A=6、C=