2012-12-15 77 views
21

在這種相當基本的C++代碼,涉及隨機數生成段時間返回同一個號碼:RAND()每次程序運行

include <iostream> 
using namespace std; 

int main() { 
    cout << (rand() % 100); 
    return 0; 
} 

爲什麼我總是得到的41的輸出?我試圖讓它輸出一個0到100之間的隨機數。也許我不理解rand函數的工作原理。

+45

隨機函數是不是41隨機還不夠嗎?我不會想到它肯定... –

+4

你忘了初始化'srand'(http://en.cppreference.com/w/cpp/numeric/random/rand) – Borgleader

+0

不應該是一個不同的每次我運行它的數量? – codedude

回答

32

您需要更改seed

int main() { 

    srand(time(NULL)); 
    cout << (rand() % 101); 
    return 0; 
} 

srand播種件事是真的也爲c語言代碼。


參見: http://xkcd.com/221/

5

您還沒有播種的數量。

使用:

#include <iostream> 
#include <ctime> 

using namespace std; 

int main() 
{ 
    srand(static_cast<unsigned int>(time(0))); 
    cout << (rand() % 100) << endl; 
    return 0; 
} 

你只需要種子它雖然一次。基本上不要每一個隨機數字。

5

srand()種子隨機數發生器。如果沒有種子,生成器無法生成您正在查找的數字。只要對隨機數的需求不是安全關鍵(例如任何類型的密碼術),通常的做法是使用<ctime>庫中的time()函數將系統時間用作種子,如srand(time(0))。這將使隨機數生成器的系統時間表示爲Unix時間戳(即自1970年1月1日以來的秒數)。然後您可以使用rand()來生成一個僞隨機數。

這裏是從duplicate question報價:

的原因是,從rand()函數產生的隨機數不是 隨機實際。它只是一個轉變。維基百科給出了更好的 解釋僞隨機數發生器的含義:確定性的 隨機位發生器。每次調用rand()時,都需要生成種子和/或最後一個隨機數(C標準沒有指定使用的算法 ,儘管C++ 11有指定一些常用算法的功能),但是,運行 對這些數字進行數學運算,並返回結果。因此,如果 種子狀態每次都是相同的(就像你不用真正的 隨機數調用srand一樣),那麼你總是會得到相同的「隨機」數字。

如果您想了解更多,您可以閱讀以下內容:

http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/

http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/

9

對於什麼它值得你也是0到99之間只產生數(含) 。如果你想生成0到100之間的值,你需要。

rand() % 101 

除了像其他人提到的那樣調用srand()。

+0

好點。這是值得的upvote :) – codedude

+0

此外,數字將不會均勻分佈,因爲它不太可能蘭德返回數量均勻分佈在101的確切倍數。 – jcoder

3

像Borland的編譯

using namespace std; 

int sys_random(int min, int max) { 
    return (rand() % (max - min+1) + min); 
} 

void sys_randomize() { 
    srand(time(0)); 
}