概述
引入
我们都知道我们平常代码所用的随机数都是伪随机数,大家是否想过我们的计算机能否产生真随机数?其实,是可以的,比如使用物理方法:
但是,
伪随机数
所以,我们大多都偏爱了伪随机数,下面,让我们来了解伪随机数到底是如何生成的。
我们先设计一个函数 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(xn−1)。这样,我们就有了 n − 1 n-1 n−1个随机数(给定的 x 1 x_1 x1我这里不算)。至此,伪随机数的生成工作就完成了。
不过,我们应该能都发现,上述过程存在着一些问题:
- 只要两次给定的初始值 x 1 x_1 x1是相同的,那么生成的随机数序列就是相同的。
- 产生的随机数序列会有周期性现象,试着想想,如果生成 [ 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 的设置上。
最后
以上就是雪白眼睛为你收集整理的伪随机数产生的乘同余法的全部内容,希望文章能够帮你解决伪随机数产生的乘同余法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复