C語言 偽隨機數問題以及解決方案

2021-10-06 07:50:21 字數 927 閱讀 3925

1.rand()函式作用:產生隨機數值,函式範圍:0 ~ 32767

舉例:int x = rand() //隨機產生0~32767內的數字x

理解偽隨機數:用乙個程式舉例:

int

main()

printf

("\n");

return0;

}

執行結果:隨機產生10個數,但每次10個隨機數都一樣,稱為偽隨機數

為什麼出現上面結果:簡單理解為:rand()函式產生的隨機數,生成在隨機表中, 這個表裡每個位置的數字都是隨機產生的,但是一旦產生這個位置的值就不變了,上面舉例的函式每次呼叫都是取位置一樣(下標從0-9)的值因此一樣

2.解決方案

2.1srand( (unsigned)time( null ) ) ;

加乙個隨機種子(隨機數生成器): srand((unsigned)time( null )); 需 引用標頭檔案

srand( )括號中為種子,種子不同,產生隨機數不同,種子一樣隨機數一樣例如: srand(1)=srand(1)

為了每次隨機數不同,()中種子要隨時變化,用時間time:返回的是2023年1月1日0點到現在時間流失的秒數值

2.2加了隨機數生成器仍有缺陷,例如 :

2048專案c語言**中,遊戲開始初始狀態為隨機兩個位置產生2或4,若把下標設為隨機函式,兩次函式呼叫緊接著,而程式的執行是很快的,很可能會導致兩次函式在同一秒執行,即隨機種子幾乎一樣

解決方案,為使隨機種子不重複,在time後再加變動的常數值,例如:

定義乙個全域性變數:int gap = 0;

srand( (unsigned)time( null ) + gap++);

C語言的偽隨機數

一直想好好的系統的學習一下c語言的偽隨機數,今天終於逮到機會了 因此上述的srand unsigned time null 是利用系統時間來初始化隨機種子的。最後來介紹一下重要的乙個函式rand rand函式 標頭檔案 定義函式 int rand void 函式功能 產生隨機數 函式說明 因為ran...

C 偽隨機數

自然界中的有很多不確定的物理現象,通過測量這些現象,就可以獲得真隨機數。比如白雜訊的幅值 電子元器件的電壓雜訊等,真隨機數可以通過用硬體對這些引數進行採集獲得。偽隨機數序列是用確定性的演算法計算出來的週期很長的序列。程式的執行過程是乙個確定的過程,每一條指令都是確定的,因此不能產生真的隨機數。說到偽...

偽隨機數的問題

c,c vb,c 中用的隨機數都是偽隨機數,偽隨機數的乙個問題就是取值分布不均勻。比如 如果從100種隨機抽取,如果1和100都是一等獎,但是1和100的出現機率完全不是1 有可能比1 也有可能比1 小.也不知道各種資料庫中的隨機數最終是否也是採用了偽隨機數.目前如果要分布均勻,一般都是用高斯隨機數...