2013-08-22 106 views
2

cplusplus.com reference它指出,當試圖生成隨機數將較低的數字更容易使用模運算符:生成均勻分佈的僞隨機數在C++

random_var = rand() % 100 + 1; //this will generate numbers between 1-100 

爲什麼較低的數字更容易?而且如果是,爲什麼我們不使用下面這段代碼:

random_var = rand()/(RAND_MAX/100) + 1; //also will generate those, more uniform I guess 
+4

我解釋了一點關於[在這個答案](http://stackoverflow.com/a/7114482/596781)。 –

+0

最簡單的替代品就是使用''。 – chris

回答

5

比方說,RAND_MAX是150(顯然,這是不實際的。)我們從0-99想要的數字。然後我們做rand() % 100。涼。

問題是,如果RAND()返回的數字大於100,該怎麼辦?我們以102 102 % 100 = 22 % 100 = 2。所以有一個2/150的機會,我們將得到一個2與給定的算法。但是50以上的數字?我們只有一個1/150的機會。 RAND_MAX越高,問題越少,但這仍然是一個問題。

請注意,如果RAND_MAX可以被您想要「調節」的數量整除,那麼所有的數字都是相同的可能性。即如果RAND_MAX是200而不是150.希望這有助於!

編輯:實際的數學。

RAND_MAX保證至少爲32767.如果我們想要範圍從0-99,我們可以做RAND() % 100。然後,0到67之間的數字將全部出現328次可能,而68-99每次只出現327次。對於前68個數字來說,這是一個1.0010071%的機會,其餘的機會只有0.9979553%的機會。我們希望他們都是1%!通常不是一個主要問題,但取決於用例,可能會顯示一些奇怪的行爲。

+0

謝謝,我現在明白了,如果我們在第二種情況下使用rand()/(RAND_MAX/100)的float分區,該怎麼辦。這能解決問題嗎? –

+0

我還沒有運行模擬或做了數學,但我敢肯定,第二種方法是正確的。我認爲由於浮動的本質,它可能會有一些有點時髦的行爲,並且會稍微慢一點,但看起來它會是一種平坦的分佈。如果我錯了,有人糾正我! – vroomfondel

+0

非常好的解釋。我從未意識到這一點! –