日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用线性同余法生成伪随机数

發布時間:2024/8/1 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用线性同余法生成伪随机数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用線性同余法生成偽隨機數

在計算機上可以用物理方法來產生隨機數,但價格昂貴,不能重復,使用不便。另一種方法是用數學遞推公式產生,這樣產生的序列與真正的隨機數序列不同,所以稱為偽隨機數或偽隨機序列,只要方法和參數選擇合適,所產生的偽隨機數就能滿足均勻性和獨立性,與真正的隨機數具有相近的性質。

產生隨機數的方法是先用一定的方法產生[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比較:

function A = fakerand( a,c,m,r0 ) A=zeros(100,1); R=zeros(100,1); R(1)=mod((a*r0+c),m); A(1)=R(1)/m; for i=1:99R(i+1)=mod((a*R(i)+c),m);A(i+1)=R(i+1)/m; end mean(A)ans =0.5345 var(A)ans =0.0768

使用MATLAB內置函數rand:

mean(A)ans =0.4940>> var(A)ans =0.0835>>

其實兩者相差不大

總結

以上是生活随笔為你收集整理的用线性同余法生成伪随机数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。