在計算機中並沒有乙個真正的隨機數發生器,但是可以做到使產生的數字重複率很低,這樣看起來好像是真正的隨機數,實現這一功能的程式叫隨機數發生器。
無論採用什麼數學演算法產生隨機數發生器,都必須給它提供乙個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。「種子」的值通常是用快速暫存器或移位暫存器來生成的。
現在的c編譯器都提供了乙個基於ansi標準的偽隨機數發生器函式,用來生成隨機數。它們們就是rand()和srand函式。這二個函式的工作過程如下:
1〉 首先給srand()提供乙個unsigned型別的種子,其取值範圍是0-65535(2^16-1);
2〉 然後呼叫rand(),它會根據提供給srand()的種子值返回乙個隨機數(windows下隨機數取值範圍是0-65535,linux下隨機數取值範圍是0-2147483647)
3〉 根據需要多次呼叫rand(),從而不斷地得到新的隨機數
4〉 無論什麼時候,都可以賦予srand乙個新的種子,從而進一步「隨機化」rand的輸出結果。
stdlib.h
void srand(unsigned int seed);
設定rand()產生隨機數時的隨機數種子
stdlib.h
int rand(void);
範圍是0-rand_max(定義在stdlib.h中,值為2147483647)的整數
產生隨機數
a> 沒有利用srand設定隨機數種子,直接呼叫rand,則預設隨機數種子為1,即預設srand(1);
例一:
#include #include #include #define max 100
int main(int argc,char *argv)
輸出結果:
前後兩次輸出結果一樣。
b> srand常用系統時間或者執行緒id作為引數。
為了防止隨機數每次重複常常使用系統時間來初始化,即使用time
函式來獲得系統時間,然後將time_t型資料轉化為(unsigned)型再傳給srand函式,
即:
srand((unsigned) time(&t));
還有乙個經常用法,不需要定義time_t型t變數,
即:
srand((unsigned) time(null));
因為time這個函式由於歷史問題,有兩種用法
time(&t); //由t返回時間
或者
t=time(null);
srand((int)getpid());
使用程式的id(
getpid
())來作為初始化種子,在同乙個程式中這個種子是固定的。
c> 可以在程式中的任意位置設定隨機數種子。
例二:
#include#include#includeintmain(int argc,char *argv)
srand((unsigned int)time(0));
printf("the second array:\n");
for(k=0;k<10;k++)
printf("the third array:\n");
for(k=0;k<10;k++)
return 0;
}
輸出結果 :
d> 關於rand_max
linux下rand_max和windows下的rand_max(都是32位作業系統):
window下的rand_max為:0x7fff=2^15-1
linxu下的rand_max為:2^31-1 加上乙個正數最高位就為1=負數,即 - rand_max=rand_max+1所以 - rand()/rand_max=rand()/(rand_max+1)
隨機數 偽隨機數
隨機數 偽隨機數 rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。srand unsigned seed 通過引數seed改變系統提供的種子值,從而可以使得每次呼...
隨機數生成 偽隨機數和真隨機數
c語言隨機數的生成,很隨機,又不隨機,比如像下面的程式 c語言生成隨機數的函式在stdlib.h庫中 include includeint main return 0 上面的 經過執行生成了 41 18467 6334 26500但是無論執行多好遍結果都是一樣的,隨機數並不隨機。這是因為rand 函...
隨機數 科普 真隨機數和偽隨機數
位元幣使用者很喜歡討論 非對稱加密 橢圓曲線 量子計算機 這類高深莫測的話題,然後再以一種非常莫名其妙的方式把幣弄丟,比如說 隨機 隨機很重要,對於位元幣這種密碼學電子貨幣來說,尤其重要。可惜社群內對於隨機的討論並不多,導致很多人缺乏正確的認識,因此,我們今天就和大家聊聊隨機。說到隨機,有兩個必須要...