我寫了這個功能:隨機數生成使用srand()函數
int getRandomNumber(int min,int max)
{
srand(time(NULL));
return rand()%(max-min+1);
}
,並把它稱爲是這樣的:
int x=getRandomNumber(0,2);
int y=getRandomNumber(0,2);
但我總是得到x的值相同和y,即X =總是。
如何解決它?
我寫了這個功能:隨機數生成使用srand()函數
int getRandomNumber(int min,int max)
{
srand(time(NULL));
return rand()%(max-min+1);
}
,並把它稱爲是這樣的:
int x=getRandomNumber(0,2);
int y=getRandomNumber(0,2);
但我總是得到x的值相同和y,即X =總是。
如何解決它?
問題是x
和y
幾乎立即被初始化。因此在兩種情況下time(NULL)
都會返回相同的值。 按照luk32的建議,您可以初始化一次。但更好的選擇是避免使用rand()
。 C++ 11中有新的選項,在隨機性和易用性方面更好。 看看這個演示: rand considered harmful.
您想(我沒有機會,雖然測試)的代碼示例:
#include <random>
int getRandomNumber(int min,int max)
{
std::random_device randomDevice; //I put it here just for simplification. Creating a random device is slow, so you should avoid creating it every time.
std::mt19937 rgen(randomDevice()); // mersenne_twister
std::uniform_int_distribution<int> uniformDistribution(min, max); // min and max are included
return uniformDistribution(rgen);
}
不能保證'std :: random_device'的兩個不同實例會產生不同的隨機數序列,所以這個代碼可能會遭受與原始版本完全相同的**問題。 –
@PeteBecker,你可能是對的。它可能是實現定義的。無論如何,正如我所說的,每次都不推薦重新創建隨機設備,因爲它很昂貴。我想簡化這個例子,看起來我已經走得太遠了:)你怎麼看待它的靜態?我不想讓它成爲全球。 – FreeNickname
srand
是爲了初始化發生器。您應該初始化一次,例如在節目開始時。然後致電rand
。
現在您每次調用該函數時都會初始化它。之所以相同,是因爲你爲srand
提供了兩次相同的參數。 time(0)
返回從時代到當前時間的秒數。
基本上你會重新啓動發生器,以便每秒鐘後每次調用相同的狀態。如果你讓它運行3秒,你會看到3組不同的值。
另外你的配方略有不對。你忘了按分鐘移動它。
rand()%(max-min+1)+min
此外,如果你有c++
工作,你可能會從FreeNickname採取建議和使用c++
特定功能。
此參數對於srand()非常重要。相同的種子會產生相同的序列。 – Polymorphism
我做到了,但現在如果我運行for循環,如: srand(time(NULL)); 對(INT p = 0時,P <50; ++ p)的 { INT X = .. INT Y = .. } x和y現在得到不同的值,但相同的值所有的時間即,對於每個循環的迭代。 –
@Polymorphism我編輯了答案,給出了觀察到的原因的精確解釋。 – luk32
我更新了我的答案,幷包含一個C++ 11代碼的例子,可能會對您有所幫助。請看一看。 – FreeNickname
你可以用'c'或'C++'標記它,但不能同時標記它,以獲得更好的定製答案。 – luk32