偽隨機數產生的乘同餘法

2021-10-22 10:32:54 字數 1581 閱讀 7652

我們都知道我們平常**所用的隨機數都是偽隨機數,大家是否想過我們的計算機能否產生真隨機數?其實,是可以的,比如使用物理方法:

但是,所以,我們大多都偏愛了偽隨機數,下面,讓我們來了解偽隨機數到底是如何生成的。

我們先設計乙個函式f(x

)f(x)

f(x)

(也可以叫做遞推公式),然後給定x

1x_1

x1​,輸出x

2x_2

x2​,即x2=

f(x1

)x_2=f(x_1)

x2​=f(

x1​)

,然後依次進行下去,x3=

f(x2

)x_3=f(x_2)

x3​=f(

x2​)

,…,xn=

f(xn

−1)x_n=f(x_)

xn​=f(

xn−1

​)。這樣,我們就有了n−1

n-1n−

1個隨機數(給定的x

1x_1

x1​我這裡不算)。至此,偽隨機數的生成工作就完成了。

不過,我們應該能都發現,上述過程存在著一些問題:

只要兩次給定的初始值x

1x_1

x1​是相同的,那麼生成的隨機數序列就是相同的。

產生的隨機數序列會有週期性現象,試著想想,如果生成[0,

31][0,31]

[0,31]

的隨機數,一旦發現產生的隨機數序列**現兩個一樣的數,xi=

xi+t

x_i=x_

xi​=xi

+t​,那麼t

tt就是週期,因為套用那個函式f(x

)f(x)

f(x)

得到的後續結果是一模一樣的。

上面的兩個問題都足以說明:用這種方法產生的隨機數是偽隨機數。

利用上面的第2個問題,我們補充一些概念:

週期:出現迴圈現象的偽隨機數個數,比如上面是t

tt。因為隨機數序列中x

ix_i

xi​和xi+

tx_xi+t

​中的所有隨機數都會一直迴圈下去,這裡一共有n個。

最大容量:出現迴圈前,已經產生的隨機數個數的最大值。前面的例子最大容量為i+t

i+ti+

t。

至此,我們對計算機中產生隨機數的原理都大概懂了,但是我們還沒有具體化這個遞推函式f(x

)f(x)

f(x)

。該方法遞推公式如下:

x i+

1=(a

xi)m

od(m

)x_=(ax_i) mod ( m)

xi+1​=

(axi

​)mo

d(m)

所以,其中難點出在了初值x

1x_1

x1​、a

aa 和 m

mm 的設定上。

線性同餘法的偽隨機數

學校練習,簡單的我就不放上來了,值得整理的,我儲存一下 習題91.1.偽隨機數 線性同餘法 1.1.1.演算法描述 我們使用線性同餘法,來限定一些離散點在y a x b上。1.1.2.偽 random n,m,seed,a,b 根據現行同餘法生成 n個偽隨機書的乙個序列 輸入 乙個正整數 n和正整數...

線性同餘法生成為隨機數

線性同餘方法 lcg 是個產生偽隨機數的方法。它是根據遞迴公式 其中是產生器設定的常數。lcg的週期最大為 但大部分情況都會少於m。要令lcg達到最大週期,應符合以下條件 互質 的所有質因子的積能整除 若是4的倍數,也是 都比 小 是正整數。線性同餘演算法有m a c 和x0 4個引數,通過置xn ...

MATLAB產生偽隨機數

p haltonset d 構造乙個d 維點集p,這是haltonset具有預設屬性設定的。輸入引數d是p的維數。p haltonset d,name,value 集特性的p使用乙個或多個名稱值對引數。將每個屬性名稱括在引號中。例如,haltonset 5,leap 3 從第一點 第四點 第七點 第...