我們都知道我們平常**所用的隨機數都是偽隨機數,大家是否想過我們的計算機能否產生真隨機數?其實,是可以的,比如使用物理方法:
但是,所以,我們大多都偏愛了偽隨機數,下面,讓我們來了解偽隨機數到底是如何生成的。
我們先設計乙個函式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個問題,我們補充一些概念:
週期:出現迴圈現象的偽隨機數個數,比如上面是ttt。因為隨機數序列中x
ix_i
xi和xi+
tx_xi+t
中的所有隨機數都會一直迴圈下去,這裡一共有n個。
最大容量:出現迴圈前,已經產生的隨機數個數的最大值。前面的例子最大容量為i+t至此,我們對計算機中產生隨機數的原理都大概懂了,但是我們還沒有具體化這個遞推函式f(xi+ti+
t。
)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 從第一點 第四點 第七點 第...