2013-11-28 8 views
14

每當我運行下面的程序返回的值始終爲6或13蘭特()%14只產生了6值或13

#include <iostream> 
#include <fstream> 
#include <ctime> 
#include <cstdlib> 
using namespace std; 

//void randomLegs(); 
//void randomPush(); 
//void randomPull(); 
//void randomMisc(); 


int main(int argc, const char * argv[]) 
{ 
    srand(time(NULL)); 
    //randomLegs(); 
    cout << rand() % 14; 
    return 0; 
} 

我今天在運行程序的近百次,昨天。

誰能告訴我我做錯了什麼?

謝謝。

編輯:順便說一句,如果我更改rand()的範圍說13或15它工作得很好。

+0

如果您有超出'rand'保證滿足的特定要求,請勿使用'rand'。 –

回答

8

我可以重現該問題在Mac OS X 10.9和Xcode 5 - 它看起來像它實際上可能是一個錯誤,或者rand()/srand()至少限制OS X 10.9。

我推薦你使用arc4random()來代替,該作品比rand()好很多,並且不要求你隨機種子:

#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main(int argc, const char * argv[]) 
{ 
    cout << (arc4random() % 14) << endl; 
    return 0; 
} 

測試:

$ g++ -Wall -O3 srand.cpp && ./a.out 
5 
$ ./a.out 
8 
$ ./a.out 
0 
$ ./a.out 
8 
$ ./a.out 
11 
$ ./a.out 
8 
$ ./a.out 
3 
$ ./a.out 
13 
$ ./a.out 
9 
$ 
+2

謝謝保羅。這個解決方案很簡單,它解決了我的問題。 – Kenneth

+5

爲什麼使用其他庫,如果標準庫也有替代方案?見'',特別是'std :: mt19937'這是一個已知的好RNG。它還附帶了'std :: uniform_int_distribution' – MSalters

+2

@ MSalters:'arc4random()'在Mac OS X,iOS和各種BSD平臺上非常標準,並且不需要額外的庫。 –

3

rand() % 14通常是一個可憐的隨機數發生器。你可能會得到更好的結果與此

(int)(14*(rand()/(RAND_MAX + 1.0))) 
+2

這是唯一未刪除的答案!掛在@john! –

+0

只是爲了澄清。我不是那個刪除答案的人。 – Kenneth

+0

@ user3045273,別擔心 - 它們被其所有者刪除。 –

33

wikipedia,在蘋果的MCG隨機數發生器中使用的乘數是16807.這可以被7整除,因此在srand()之後產生的第一個隨機數將只有一個熵位mod 14(也就是說,它可以o只有兩個值)。

這是一個蹩腳的RNG,他們已經到了那裏。然而,一個簡單的解決方案只需要在srand之後幾次調用rand(),並放棄結果。

+7

+1,美麗的解釋!我不知道這些東西可能會有多麼脆弱。通常,我所看到的「爲什麼你永遠不應該在短程範圍內模數」的解釋就是它的邊緣不均勻。 – Leeor

+15

順便提一句,更簡單的解決方法是等待大約1800萬年,然後再次嘗試該程序。此時,由'time()'返回的值將足夠大以將熵「繞拐角」推入低位位。試試看,讓我們的後代知道它是如何運作的。 :-D – Sneftel

+0

+1,很好的答案。 –