相同的序列我有以下的方法,其產生隨機數:蘭特()總是返回上應用程序重新啓動
int random_number() //Random number generator
{
int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000
return x;
}
給此方法的呼叫在一個循環中它迭代五次使用。這種方法的問題在於,它幾次運行該程序時似乎總是生成相同的數字。這怎麼解決?
相同的序列我有以下的方法,其產生隨機數:蘭特()總是返回上應用程序重新啓動
int random_number() //Random number generator
{
int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000
return x;
}
給此方法的呼叫在一個循環中它迭代五次使用。這種方法的問題在於,它幾次運行該程序時似乎總是生成相同的數字。這怎麼解決?
您需要seed隨機數發生器,如:
srand (time(NULL));
int x = rand() % 1000000 + 1;
播種的僞隨機數發生器從根本上決定設定,它會遍歷隨機數。使用時間是實現充分隨機結果的標準方法。
編輯:
爲了澄清,你應該只有一次種子,並得到很多的隨機數,這樣的事情:
srand (time(NULL));
loop {
int x = rand() % 1000000 + 1;
}
不是一樣的東西:
loop {
//Particularly bad if this line is hit multiple times in one second
srand (time(NULL));
int x = rand() % 1000000 + 1;
}
femtoRgon是正確的。這將播種計劃,但看看在新的C++標準,因爲他們已經改善隨機數生成 看到
蘭特是不是一個真正的隨機數,而是一個僞隨機一個,僅僅「如果您不知道用於生成值的算法,則看起來是「隨機的」。從手冊頁:
的rand()函數返回值的範圍爲0〜RAND_MAX包容
僞隨機意味着給定相同的輸入的僞隨機整數,稱爲種子,它會給出相同的輸出。當您嘗試調試問題時,這實際上非常有用,因爲將返回相同的「隨機」值,讓您重現問題。 如果你真的需要隨機性,這很糟糕。
如上所述,通過在每次運行中將種子改變爲不同的東西,比如自從epoch以來的秒數,您可以從調用rand()獲得不同的值。
srand(time(NULL))
如果您嘗試調試,您可能需要打印出種子,以便在發生問題時可以重現問題。
['srand()'](http://www.cplusplus.com/reference/clibrary/cstdlib/srand/)可能派上用場。但是,如果發現1000000明顯大於[RAND_MAX](http://www.cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/)的大多數實現定義,則可能會鬱悶地採用該模數。 – WhozCraig