用线性同余法生成伪随机数
用線性同余法生成偽隨機(jī)數(shù)
在計(jì)算機(jī)上可以用物理方法來(lái)產(chǎn)生隨機(jī)數(shù),但價(jià)格昂貴,不能重復(fù),使用不便。另一種方法是用數(shù)學(xué)遞推公式產(chǎn)生,這樣產(chǎn)生的序列與真正的隨機(jī)數(shù)序列不同,所以稱為偽隨機(jī)數(shù)或偽隨機(jī)序列,只要方法和參數(shù)選擇合適,所產(chǎn)生的偽隨機(jī)數(shù)就能滿足均勻性和獨(dú)立性,與真正的隨機(jī)數(shù)具有相近的性質(zhì)。
產(chǎn)生隨機(jī)數(shù)的方法是先用一定的方法產(chǎn)生[0,1]均勻分布的隨機(jī)數(shù),然后通過(guò)一個(gè)適當(dāng)?shù)淖儞Q就可以得到符合某一概率模型的隨機(jī)數(shù)。
原理:假設(shè)我們要生成偽隨機(jī)數(shù)列為R0、R1、R2…。首先,我們根據(jù)偽隨機(jī)數(shù)的種子,用下列公式計(jì)算第一個(gè)偽隨機(jī)數(shù)R0
R0=(A*種子+C)mod M
接下來(lái)用R0生成R1,R1生成R2,遞歸即可
當(dāng)a=0時(shí)為和同余法,當(dāng)c=0時(shí)為乘同余法,c≠0時(shí)為混合同余法
常用的產(chǎn)生[0,1]均勻分布的隨機(jī)數(shù)的方法有乘同余法和混合同余法。
簡(jiǎn)而言之,線性同余法就是將當(dāng)前的偽隨機(jī)數(shù)值乘以A再加上C,然后將除以M得到的余數(shù)作為下一個(gè)偽隨機(jī)數(shù)。在線性同余法中,最近一次生成的偽隨機(jī)數(shù)的值就是內(nèi)部狀態(tài),偽隨機(jī)數(shù)的種子被用來(lái)對(duì)內(nèi)部狀態(tài)進(jìn)行初始化。
在線性同余法中,只要謹(jǐn)慎選擇A、C、M的值,就能夠很容易地生成具備隨機(jī)性的偽隨機(jī)數(shù)列。
由于偽隨機(jī)數(shù)是除以M得到的余數(shù),因此其范圍必定是0~M-1,而且生成的隨機(jī)數(shù)會(huì)呈現(xiàn)一定周期(打個(gè)比方,x mod 12 代表的是鐘表刻度,它的值永遠(yuǎn)在0-11之間,這個(gè)概念在數(shù)學(xué)里叫”同余”)。而且根據(jù)A、C、M的值,最終只能生成上述范圍中的一部分值(因此周期會(huì)縮短)。
線性同余法的最大周期是m,但一般情況下會(huì)小于m。要使周期達(dá)到最大,應(yīng)該滿足以下條件:
(1) c和m互質(zhì);
(2) m的所有質(zhì)因子的積能整除a-1;
(3) 若m是4的倍數(shù),則a-1也是;
(4) a,c,r0(初值,一般即種子)都比m小;
(5) a,c是正整數(shù)。
線性同余方法速度快,如果對(duì)乘數(shù)和模數(shù)進(jìn)行適當(dāng)?shù)倪x擇,可以滿足用于評(píng)價(jià)一個(gè)隨機(jī)數(shù)產(chǎn)生器的3 種準(zhǔn)則:
(1)這個(gè)函數(shù)應(yīng)該是一個(gè)完整周期的產(chǎn)生函數(shù)。也就是說(shuō),這個(gè)函數(shù)應(yīng)該在重復(fù)之前產(chǎn)生出0 到m之間的所有數(shù);
(2)產(chǎn)生的序列應(yīng)該看起來(lái)是隨機(jī)的;
(3)這個(gè)函數(shù)應(yīng)該用32bit 算術(shù)高效實(shí)現(xiàn)。
使用混合同余法
Ri+1=(a*Ri+c)mod(m)
Yi+1=Ri+1/m
在matlab中自己選取a,c,m與其內(nèi)置函數(shù)rand比較:
使用MATLAB內(nèi)置函數(shù)rand:
mean(A)ans =0.4940>> var(A)ans =0.0835>>其實(shí)兩者相差不大
總結(jié)
以上是生活随笔為你收集整理的用线性同余法生成伪随机数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通信算法之二:信道编码译码 BCH码、R
- 下一篇: ffmpeg实现摄像头拉流_ffmpeg