伪随机数产生的乘同余法

引入

我们都知道我们平常代码所用的随机数都是伪随机数,大家是否想过我们的计算机能否产生真随机数?其实,是可以的,比如使用物理方法:
在这里插入图片描述
但是,
在这里插入图片描述

伪随机数

所以,我们大多都偏爱了伪随机数,下面,让我们来了解伪随机数到底是如何生成的。

我们先设计一个函数 f ( x ) f(x) f(x)(也可以叫做递推公式),然后给定 x 1 x_1 x1,输出 x 2 x_2 x2,即 x 2 = f ( x 1 ) x_2=f(x_1) x2=f(x1),然后依次进行下去, x 3 = f ( x 2 ) x_3=f(x_2) x3=f(x2),…, x n = f ( x n − 1 ) x_n=f(x_{n-1}) xn=f(xn1)。这样,我们就有了 n − 1 n-1 n1个随机数(给定的 x 1 x_1 x1我这里不算)。至此,伪随机数的生成工作就完成了。

不过,我们应该能都发现,上述过程存在着一些问题:

  1. 只要两次给定的初始值 x 1 x_1 x1是相同的,那么生成的随机数序列就是相同的。
  2. 产生的随机数序列会有周期性现象,试着想想,如果生成 [ 0 , 31 ] [0,31] [0,31]的随机数,一旦发现产生的随机数序列中出现两个一样的数, x i = x i + T x_i=x_{i+T} xi=xi+T,那么 T T T就是周期,因为套用那个函数 f ( x ) f(x) f(x)得到的后续结果是一模一样的。

上面的两个问题都足以说明:用这种方法产生的随机数是伪随机数。

利用上面的第2个问题,我们补充一些概念:

周期:出现循环现象的伪随机数个数,比如上面是 T T T。因为随机数序列中 x i x_i xi x i + T x_{i+T} xi+T中的所有随机数都会一直循环下去,这里一共有n个。

最大容量:出现循环前,已经产生的随机数个数的最大值。前面的例子最大容量为 i + T i+T i+T

至此,我们对计算机中产生随机数的原理都大概懂了,但是我们还没有具体化这个递推函数 f ( x ) f(x) f(x)

乘同余法

该方法递推公式如下:
x i + 1 = ( A x i ) m o d ( M ) x_{i+1}=(Ax_i) mod ( M) xi+1=(Axi)mod(M)
所以,其中难点出在了初值 x 1 x_1 x1 A A A M M M 的设置上。

猜你喜欢

转载自blog.csdn.net/qq_43391414/article/details/114902402