linux產生隨機數

2021-06-07 12:21:52 字數 1987 閱讀 6860

函式rand()是真正的隨機數生成器,而srand()會設定供rand()使用的隨機數種子。函式rand()會返回乙個處於0和你所指定的數值(缺 省為1)之間的分數。如果你在第一次呼叫rand()之前沒有呼叫srand(),那麼系統會為你自動呼叫srand()。而使用同種子相同的數呼叫 srand()會導致相同的隨機數序列被生成。

srand((unsigned)time(null))則使用系統定時/計數器的值做為隨機種子,所以,在相同的平台環境下,顯示的隨機數會是偽隨機數,即每次執行顯示的結果會有不同。

庫函式中系統提供了兩個函式用於產生隨機數:srand()和rand()。 原型為:

函式一:int rand(void);

從srand (seed)中指定的seed開始,返回乙個[0, 

rand_max(0x7fff)]間的隨機整數。

函式二:void srand(unsigned seed);

引數seed是rand()的種子,用來初始化rand()的起始值。

但是,要注意的是所謂的「偽隨機數」指的並不是假的隨機數。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機數。計算機生 成的偽隨機數既是隨機的又是有規律的 —— 一部份遵守一定的規律,一部份則不遵守任何規律。

比如「世上沒有兩片形狀完全相同的樹葉」,這正點到了事物的特性 —— 規律性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 —— 規律性。從這個角度講,我們就可以接受這樣的事實了:計算機只能產生偽隨機數而不是絕對的隨機數。

系統在呼叫rand()之前都會自動呼叫srand(),如果使用者在rand()之前曾呼叫過srand()給引數seed指定了乙個值,那麼 rand()就會將seed的值作為產生偽隨機數的初始值;而如果使用者在rand()前沒有呼叫過srand(),那麼系統預設將1作為偽隨機數的初始 值。如果給了乙個定值,那麼每次rand()產生的隨機數序列都是一樣的~~

所以為了避免上述情況的發生我們通常用srand((unsigned)time(0))或者srand((unsigned)time(null))來 產生種子。如果仍然覺得時間間隔太小,可以在(unsigned)time(0)或者(unsigned)time(null)後面乘上某個合適的整數。 例如,srand((unsigned)time(null)*10)

另外,關於time_t time(0):time_t被定義為長整型,它返回從2023年1月1日零時零分零秒到目前為止所經過的時間,單位為秒。

關於求值區域的問題:要取得[a,b)之間的隨機整數,使用(rand() % (b-a))+ a (結果值將含a不含b)。

在a為0的情況下,簡寫為rand() % b。

最近需要編寫乙個產生隨機數的函式,在網上搜尋了很久,發現好多人提供的方法不是很妥當,產生的隨機數的隨機性不夠好。一般的方法是:例如產生乙個隨機數在1~100之間的數,

有的人會使用如下方法:

srand(time(0));

rand()%100+1;

這樣可以產生符合要求的隨機數,但是,隨機性不太好,因為使用time(0)作為種子,在一秒之內種子是不會變得。

另外,看大srand的幫助可以知道,不建議使用%去獲取隨機數。另外,可以通過使用微妙,來增加隨機數的隨機性。例子如下:

struct timeval tpstart;

gettimeofday(&tpstart,null);

srand(tpstart.tv_usec);

1+(int) (100.0*rand()/(rand_max+1.0));

rand_max是系統的乙個巨集。

通過下面的程式測試,隨機數的分布的比使用time(0)的結果要均勻一些。

#include

#include

#include

#include

int main()

else if (n <= 200)

else if (n<=300)

else

sleep(1);

}return 0;

}

產生隨機數

先說明一下rand,這個函式用來產生偽隨機數。比如,產生1000的兩個隨機數,產生的兩個一般上是不同的,但如果要產生80個100以內的隨機數,僅用rand函式就不夠。因為產生80個100以內的隨機數,至少有兩個數相等的概率太大了 srand函式,並不能使產生的隨機數完全不同。你可以執行以下這串 in...

隨機數產生

c c 中取隨機數 在計算機中並沒有乙個真正的隨機數發生器,但是可以做到使產生的數字重複率很低,這樣看起來好象是真正的隨機數,實現這一功能的程式叫偽隨機數發生器。有關如何產生隨機數的理論有許多,如果要詳細地討論,需要厚厚的一本書的篇幅。不管用什麼方法實現隨機數發生器,都必須給它提供乙個名為 種子 的...

產生隨機數

一 normrnd r normrnd mu,sigma r normrnd mu,sigma,m,n,r normrnd mu,sigma,m,n,mu sigma可以是向量或矩陣 二者同為矩陣時size要相同 但必須和r的size相同 行 列 r的size可以不指定,也可以用m,n指定 n1 n...