偽隨�(jī)�(shù)�(fā)生器用于在系�(tǒng)需要隨�(jī)�(shù)的時(shí)候,通過一系列種子值計(jì)算出來的偽隨�(jī)�(shù)。因?yàn)樯梢粋�(gè)真正意義上的“隨�(jī)�(shù)”對(duì)于計(jì)算機(jī)來說是不可能�,偽隨機(jī)�(shù)也只是盡可能地接近其�(yīng)具有的隨�(jī)性,但是�?yàn)橛小胺N子值�,所以偽隨機(jī)�(shù)在一定程度上是可控可�(yù)�(cè)��
取中�
i、平方取中法
這�(gè)方法是由馮·諾伊曼�1946年提出的,思想很簡(jiǎn)�
選擇一�(gè)m位數(shù)Ni作為種子,做平方�(yùn)算(記為Ni+ 1 = (Ni * Ni�...),結(jié)果若不足2m�(gè)位,在前�(bǔ)0。在這�(gè)�(shù)選中間m�(gè)位的�(shù)作為Ni+1。這�(gè)算法明顯又很大弊�,不僅周期短而且分布不均�,比�10000平方取中�(jié)果就一直為00000��
ii、常�(shù)取中��
此方法與平方取中法稍有不同,只是把一�(gè)隨機(jī)�(shù)的平方換成了隨機(jī)�(shù)與常�(shù)的乘積(記為Ni+1 = (K * Ni�...),對(duì)于隨�(jī)分布等沒有什么提��
iii、乘法取中法
此方法是�(duì)平方取中法的一定優(yōu)�,公式記為Ni+1 = (Ni * Ni-1�...
同余�
同余是啥不知道的同學(xué)見我《素性測(cè)試》中的wilson檢測(cè)中有解釋
同余法是大部分變成語言的RNG所采用的算法,線性同余方程為、Ni+1 = a Ni + C (mod m�,其中a為乘�,C為增量,m為膜。產(chǎn)生的隨機(jī)序列Rn = Ni / m�
�(dāng) a = 1 并且 C != 0�(shí),此同余法稱為加法同余法
�(dāng)a != 1 并且 C = 0�(shí),此同余法稱為乘法同余法
�(dāng)a != 1 并且 C != 0�(shí),此同余法稱為混合同余法
同余法當(dāng)m越大,Ni的范圍也就越�,隨�(jī)分布的也就越均勻,Rn也就分布的更均勻,所以m取值應(yīng)盡可能的�,充分利用計(jì)算機(jī)字長(zhǎng)。對(duì)于如何獲得滿周期隨機(jī)�(shù)是存在判定定理的,當(dāng)且僅�(dāng)滿足下列條件�(shí),踐行同余法是滿周期��
1.C與m互質(zhì)
2.�(duì)于m的每一�(gè)�(zhì)因子p,(a-1)為p的倍數(shù)
3.若m可被4整除� (a-1)也可�4整除�
除此之外還有二次同余,三次同余等,原理差不多�
移位�
由于�(jì)算機(jī)特有的邏輯移位運(yùn)�,可以對(duì)種子N0左移n位得到M1,右移n位得到M2,將M1與M2做邏輯相加運(yùn)算得到隨�(jī)�(shù)N1�
公式為Ni+1 = Ni >> n + Ni << n.移位法速度非常�,但�(duì)初始值要求較高,很難得到滿意的隨�(jī)序列�
梅森旋轉(zhuǎn)算法
梅森旋轉(zhuǎn)算法是當(dāng)今生成隨�(jī)�(shù)�(zhì)量的算法,如php,python,perl等流行編程語言�(nèi)置的PRNG都是采用該算法實(shí)�(xiàn)�
下面是來至wiki的介��
梅森旋轉(zhuǎn)算法(Mersenne twister)是一�(gè)偽隨�(jī)�(shù)生成算法。由松本真和西村拓士�1997年開�(fā),基于有限二�(jìn)制字段上的矩陣線性地�??梢钥焖佼a(chǎn)生高�(zhì)量的偽隨�(jī)�(shù)� 修正了古典隨�(jī)�(shù)�(fā)生算法的很多缺陷�