隨機數的計算公式是什麽?
為追求真正的隨機序列,人們曾采用很多種原始的物理方法用於生成壹定範圍內滿足精度(位數)的均勻分布序列,其缺點在於:速度慢、效率低、需占用大量存儲空間且不可重現等。為滿足計算機模擬研究的需求,人們轉而研究用算法生成模擬各種概率分布的偽隨機序列。偽隨機數是指用數學遞推公式所產生的隨機數。從實用的角度看,獲取這種數的最簡單和最自然的方法是利用計算機語言的函數庫提供的隨機數發生器。典型情況下,它會輸出壹個均勻分布在0和1區間內的偽隨機變量的值。其中應用的最為廣泛、研究最徹底的壹個算法即線性同余法。
線性同余法LCG(Linear Congruence Generator)
選取足夠大的正整數M和任意自然數n0,a,b,由遞推公式:
ni+1=(af(ni)+b)mod M i=0,1,…,M-1
生成的數值序列稱為是同余序列。當函數f(n)為線性函數時,即得到線性同余序列:
ni+1=(a*ni+b)mod M i=0,1,…,M-1
以下是線性同余法生成偽隨機數的偽代碼:
Random(n,m,seed,a,b)
{
r0 = seed;
for (i = 1;i<=n;i++)
ri = (a*ri-1 + b) mod m
}
其中種子參數seed可以任意選擇,常常將它設為計算機當前的日期或者時間;m是壹個較大數,可以把它取為2w,w是計算機的字長;a可以是0.01w和0.99w之間的任何整數。
應用遞推公式產生均勻分布隨機數時,式中參數n0,a,b,M的選取十分重要。
例如,選取M=10,a=b =n0=7,生成的隨機序列為{6,9,0,7,6,9,……},周期為4。
取M=16,a=5,b =3,n0=7,生成的隨機序列為{6,1,8,11,10,5,12,15,14,9,0,3,2,13,4,7,6,1……},周期為16。
取M=8,a=5,b =1,n0=1,生成的隨機序列為{6,7,4,5,2,3,0,1,6,7……},周期為8。