2013-05-07 14 views
1

我將一個python腳本移植到C++中,該腳本調用一個函數超過了幾千次。我從來沒有用C++進行編程,所以我不確定發生了什麼,也找不出更好的標題。首次執行後變量總是相同的?

這不是我的實際功能,但它再現了同樣的錯誤

int maior_sequencia() 
{ 
    int random; 
    srand(time(NULL)); 
    int maior_sequencia = rand() % 6+1; 
    printf("%i", maior_sequencia); 
    return 1; 
} 

int main() 
{ 
    for(int i = 1; i<=100; i++) 
    { 
     maior_sequencia(); 
    } 
    return 1; 
} 

如果從maior_sequencia第一個結果()爲3,則輸出3333333 ... 如果我再次運行程序,第一個結果是5,它會輸出555555 ...

爲什麼會發生這種情況?

+6

在'main'開始時只調用'srand()'一次。 – 2013-05-07 20:24:25

回答

8
int maior_sequencia() 
{ 
    int random; 
    srand(time(NULL)); 
    //^^This will reset random seed every time you call this function 
    int maior_sequencia = rand() % 6+1; 
    printf("%i", maior_sequencia); 
    return 1; 
} 

既然你每次調用maior_sequencia功能時重置隨機種子,因此,它會給你同樣的價值。

嘗試把

srand(time(NULL)); 

main前的for循環來代替。

+0

好的,就是這樣,非常感謝。還有一個問題。 srand基於時間(),不應該每次調用它的時間都不相同? – 2013-05-07 20:30:24

+0

這個答案是正確的,但是,更多的「隨機」重新播種你的隨機數是一種很好的做法,並且會得到一個更好的真正的「隨機」數字,否則你會在很多環境中看到相同的隨機數序列。看到我的答案,我認爲這有點更完整。 – ChrisCM 2013-05-07 20:30:51

3

問題有兩方面。首先您使用srand和您使用時間。當你使用time()生成隨機數生成器時,time是從1973年的某個日期開始的秒數,我忘記了確切的日期,但它被稱爲linux時間。因爲你每次都會種子,所以你重置了隨機數發生器,這是一個很好的習慣,然而,因爲你用幾秒鐘的時間返回一個數字來播種它,所以你的程序很可能只用不到一秒的時間來運行。要麼按照其他人的建議,只給隨機數發生器播種一次,要麼播種粒度更細的東西...... ms可能是可以接受的。

+0

多次重新播種PRNG可能實際上使其無用。 rand()背後的算法被設計爲當它們被播種一次時(無論是線性同餘發生器還是更復雜的東西)都可以工作。重新播種可能會改變發生器的屬性(最重要的是它的分佈)。 – 2013-05-07 21:18:38

+0

準確地說,當尋求一個真正的隨機數時,改變它的分佈可能是一件好事。世界上一些最好的隨機數發生器使用隨機種子的僞隨機分佈或從該表中以由環境因素(例如大氣噪聲或放射性衰減)確定的隨機間隔拉動。否則,你會看到循環的隨機數模式......這本質上不是隨機的。 http://www.random.org/雖然你說的是正確的,但實踐依賴於實現。 – ChrisCM 2013-05-07 21:23:19

+0

通常'rand()'有望返回均勻分佈的值,這是它的主要用途。一個好的PRNG的時間可以長到足以實現完美的可用性。雖然大多數(但不是全部)PRNG都不是密碼學的,但它們都不是一個真正的RNG,其分佈不均勻。 – 2013-05-07 21:45:16

相關問題