2013-12-11 172 views
0

我寫了這個功能:隨機數生成使用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 =總是。
如何解決它?

+0

我更新了我的答案,幷包含一個C++ 11代碼的例子,可能會對您有所幫助。請看一看。 – FreeNickname

+1

你可以用'c'或'C++'標記它,但不能同時標記它,以獲得更好的定製答案。 – luk32

回答

2

問題是xy幾乎立即被初始化。因此在兩種情況下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); 
} 
+0

不能保證'std :: random_device'的兩個不同實例會產生不同的隨機數序列,所以這個代碼可能會遭受與原始版本完全相同的**問題。 –

+0

@PeteBecker,你可能是對的。它可能是實現定義的。無論如何,正如我所說的,每次都不推薦重新創建隨機設備,因爲它很昂貴。我想簡化這個例子,看起來我已經走得太遠了:)你怎麼看待它的靜態?我不想讓它成爲全球。 – FreeNickname

7

srand是爲了初始化發生器。您應該初始化一次,例如在節目開始時。然後致電rand

現在您每次調用該函數時都會初始化它。之所以相同,是因爲你爲srand提供了兩次相同的參數。 time(0)返回從時代到當前時間的秒數。

基本上你會重新啓動發生器,以便每秒鐘後每次調用相同的狀態。如果你讓它運行3秒,你會看到3組不同的值。

另外你的配方略有不對。你忘了按分鐘移動它。

rand()%(max-min+1)+min

此外,如果你有c++工作,你可能會從FreeNickname採取建議和使用c++特定功能。

+0

此參數對於srand()非常重要。相同的種子會產生相同的序列。 – Polymorphism

+0

我做到了,但現在如果我運行for循環,如: srand(time(NULL)); 對(INT p = 0時,P <50; ++ p)的 { INT X = .. INT Y = .. } x和y現在得到不同的值,但相同的值所有的時間即,對於每個循環的迭代。 –

+0

@Polymorphism我編輯了答案,給出了觀察到的原因的精確解釋。 – luk32

0

Rand is considered harmful使用新的C++ 11功能。

+0

冒名頂替的論文不會奇蹟般地創造出好的代碼。除了對'stand()'的不恰當的多次調用,原始代碼工作得很好。 –