函式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...