線性同餘法生成為隨機數

2022-06-27 07:30:26 字數 1191 閱讀 5535

線性同餘方法(lcg)是個產生偽隨機數的方法。

它是根據遞迴公式:

其中是產生器設定的常數。

lcg的週期最大為

,但大部分情況都會少於m。要令lcg達到最大週期,應符合以下條件:

互質;的所有質因子的積能整除

;若是4的倍數,

也是;都比

小;是正整數。

線性同餘演算法有m 、a 、c 和x0 4個引數,通過置xn + 1 ≡axn + c (mod m) ,求得隨機數序列< xn > , 這個序列稱作線性同餘序列。m、a 、c 和x0 分別稱做模數、乘數、增量和初始值。線性同餘方法速度快,如果對乘數和模數進行適當的選擇,可以滿足用於評價乙個隨機數產生器的3 種準則:

1.這個函式應該是乙個完整週期的產生函式。也就是說,這個函式應該在重複之前產生出0 到m之間的所有數;

2.產生的序列應該看起來是隨機的;

3.這個函式應該用32bit 算術高效實現。

在我的演算法中,a=7^5;c=0;m=2^31-1; x0為系統時間;

我的**如下:

[cpp]view plain

copy

#include 

#include 

static unsigned long rand_seed;  

void mysrand (unsigned long int);  

void myrand ();  

int  

main (void)  

return 0;  

}  void  

mysrand (unsigned long seed)  

void  

myrand ()  

===============ps==================

產生隨機種子的方法很多,目前用得比較多的是使用系統時間為種子。我覺得這種方法也不妥當。假如我批量執行程式,程式執行的時間是幾個ms,那麼幾個相鄰程式的種子就是一樣的,產生的結果因此也是一樣的。(因為系統時間是按照秒來計算的,一秒內執行多少次,產生的隨機種子就有多少相同的。)

比較流行的是使用seed = (seed * 9301 + 49297) % 233280;

return seed / (233280.0);

線性同餘法的偽隨機數

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

偽隨機數產生的乘同餘法

我們都知道我們平常 所用的隨機數都是偽隨機數,大家是否想過我們的計算機能否產生真隨機數?其實,是可以的,比如使用物理方法 但是,所以,我們大多都偏愛了偽隨機數,下面,讓我們來了解偽隨機數到底是如何生成的。我們先設計乙個函式f x f x f x 也可以叫做遞推公式 然後給定x 1x 1 x1 輸出x...

隨機生成隨機數

現畫乙個command命令按鈕,進行貼上。private sub command1 click show me scale 0,0 18,8 me.auto redraw true me.draw mode 2 circle 3,4 3,vb red me.auto redraw false lin...