2012-11-07 29 views
9

相同的序列我有以下的方法,其產生隨機數:蘭特()總是返回上應用程序重新啓動

int random_number() //Random number generator 
{ 
    int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000 
    return x; 
} 

給此方法的呼叫在一個循環中它迭代五次使用。這種方法的問題在於,它幾次運行該程序時似乎總是生成相同的數字。這怎麼解決?

+3

['srand()'](http://www.cplusplus.com/reference/clibrary/cstdlib/srand/)可能派上用場。但是,如果發現1000000明顯大於[RAND_MAX](http://www.cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/)的大多數實現定義,則可能會鬱悶地採用該模數。 – WhozCraig

回答

17

您需要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; 
} 
+0

您的建議奏效,但似乎該數字並未從一個循環更改爲下一個循環。因此,所有文件最終具有相同的名稱 – Matthew

+0

如果您正在迭代循環,請不要在每次迭代中調用srand。只稱它一次,然後蘭德無數次。如果每次都調用兩次,則同一秒內的任何調用都將返回相同的數字(因爲時間(NULL)將返回相同的值)。 – femtoRgon

+0

謝謝。這解決了這個問題:) – Matthew

5

當您的程序啓動時撥打srand(time(NULL));

srand爲rand函數設置種子。賦予它0123,的返回值有助於在每次程序運行時獲得不同的種子。

當您將問題標記爲C++時,您可以使用C++ 11功能來處理random號碼生成。

+0

你的建議工作。但是,所有五個文件現在都有相同的名稱:s – Matthew

+1

什麼文件(你在說什麼)? – tomahh

1

femtoRgon是正確的。這將播種計劃,但看看在新的C++標準,因爲他們已經改善隨機數生成 看到

Random numbers in C++0x

1

蘭特是不是一個真正的隨機數,而是一個僞隨機一個,僅僅「如果您不知道用於生成值的算法,則看起來是「隨機的」。從手冊頁:

的rand()函數返回值的範圍爲0〜RAND_MAX包容

僞隨機意味着給定相同的輸入的僞隨機整數,稱爲種子,它會給出相同的輸出。當您嘗試調試問題時,這實際上非常有用,因爲將返回相同的「隨機」值,讓您重現問題。 如果你真的需要隨機性,這很糟糕。

如上所述,通過在每次運行中將種子改變爲不同的東西,比如自從epoch以來的秒數,您可以從調用rand()獲得不同的值。

srand(time(NULL)) 

如果您嘗試調試,您​​可能需要打印出種子,以便在發生問題時可以重現問題。