程序获得的随机数,无论什么算法都必须是递归公式得到的序列,它本身违反了随机定义,因此它们不是真正的随机数。
伪随机数中非常重要的概念是“种子”。
种子确定随机数的固定序列。
例如,通过C语言rand函数获得的序列每次都是相同的。
如果要获得不同的序列,则需要调用srand来设置种子。
在Java中用新的Random(1)的构造函数参数设置种子。
采用中国方法i和平方法的方法是由冯·诺伊曼于1946年提出的。
想法是简单地选择一个m位Ni作为种子并进行平方运算(表示为Ni + 1 =(Ni * Ni)) ...),如果结果小于2m位,则第一个为0.此数字之间的m位数被选为Ni + 1。
该算法显然存在很多缺点,不仅时间短,而且分布不均匀。
例如,10,000个方格的结果总是00000.Ii。
常量采用中间方法。
该方法与square方法略有不同。
随机数的平方由随机数和常数的乘积代替(表示为Ni + 1 =(K * Ni)......)随机分布等没有改善.Iii。
乘法方法。
这种方法是方法的一定优化。
公式记为Ni + 1 =(Ni * Ni-1)...同余方法与不知道的学生相同。
测试中的Wilson测试有一个算法,用于解释同余方法是主要翻译成语言的RNG。
线性同余方程是Ni + 1 = a Ni + C(mod m),其中a是乘数。
C是增量,m是胶片。
得到的随机序列Rn = Ni / m。
当a = 1且C!= 0时,该同余方法称为加性同余方法。
当a = 1且C = 0时,这个同余方法称为乘法同余方法,当!= 1和C! = 0,这种同余方法称为混合同余方法同余方法。
当m较大时,Ni的范围较大,随机分布更均匀,Rn更均匀分布,因此m为该值。
应尽量大,充分利用电脑字长。
存在关于如何获得全周期随机数的存在定理。
当且仅当满足以下条件时,同余方法的实践是全周期的,1.C和m是相互同质的。
2.对于m的每个素因子p,(a-1)是p的倍数。
3.如果m可被4整除,则(a-1)也可以被4整除。
除此之外,还有两个同余,三个同余等。
原理类似。
由于计算机专用逻辑移位操作,移位方法可以将种子N0移位n位以获得M1,右移n位移位以获得M2,并且M1和M2进行逻辑加法以获得随机数N1。
该式为Ni + 1 = Ni>& gt; n + Ni<& lt; ñ。
移位方法非常快,但初始值很高,并且难以获得令人满意的随机序列。
梅森旋转算法梅森旋转算法是当今生成随机数的最佳算法。
PRNG内置于流行的编程语言,如php,python和perl,由该算法实现。
以下是对wiki的介绍。
Mersenne扭转器是伪随机数生成算法。
由Matsumoto Shin和Nishimura Toshi于1997年开发,基于有限二元场上的矩阵,重影是线性的。
它可以快速生成高质量的伪随机数,并纠正经典随机数生成算法的许多缺陷。