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