2012-11-21 74 views
1

可能重複:
rand function returns same values when called within a single function c++蘭特()生成相同數量的

爲什麼蘭特()生成相同數量?

die.h

#ifndef DIE_H 
#define DIE_H 


class Die 
{ 
private: 
    int number; 
public: 
    Die(){number=0;} 
    void roll(); 
    int getNumber()const{return number;} 
    void printValue(); 
}; 

#endif 

die.cpp

#include"die.h" 
#include<iostream> 
#include<time.h> 
using namespace std; 

void Die::roll() 
{ 
    srand(static_cast<int>(time(0))); 
    number=1+rand()%6; 
} 

void Die::printValue() 
{ 
    cout<<number<<endl; 
} 

的main.cpp

#include"die.h" 
#include<iostream> 
using namespace std; 

int main() 
{ 
    Die d; 
    d.roll(); 
    d.printValue(); 
    d.roll(); 
    d.printValue(); 
    d.roll(); 
    d.printValue(); 
} 
+6

使用'srand'一次。目前它一直播種着相同的序列。 – chris

+0

加上@chris所說的,這裏的關鍵是'srand'正在被連續調用,所以'time'總是返回相同的值。在調用srand之前進行一些睡眠(大約一秒鐘),你會看到行爲改變。 –

+0

你可能想看看這個:http://stackoverflow.com/questions/2254909/boost-random-number-generator – Sarang

回答

5

您對die.roll()的呼叫非常接近,因此time(0)實際上每次都會返回相同的值,因此,每次撥打.roll()時,您的rand種子都是相同的。

嘗試撥打srand(static_cast<int>(time(0)));一次(且僅一次)在.roll()之外(如在模具構造函數或main()中)。

+0

+1因爲閱讀了所有的問題,並提出了正確的答案,而不是'aha !'並且像其他一些應該保持未命名的答案一樣匆忙回答:-) – LSerni

+0

+1:這*是實際的問題。 –

+0

@Iserni,謝謝:)當我想起與一個幾乎相同的bug時,我的'aha'時刻到了! –

2

你需要一個 「真正隨機」 來初始化隨機數發生器(或最少唯一)種子,並且只做

這與srand(time(NULL))開頭通常完成。通過rand()產生

數字是不是隨機的,它們是* *僞隨機:給予相同的種子,它會總是返回相同的序列。默認情況下,我相信最初的種子是零(但是,在程序運行之間總是相同的 - 因此,如果沒有播種,每次都會得到相同的顯然是隨機的序列)。

+0

'now()'定義在哪裏? – Default

+3

'srand(time(NULL));' – emartel

+0

對不起,夥計們。我用PHP獲得了一個交叉神經元:-( – LSerni

0

由於emartel指出的那樣,你需要的唯一真正的變化是調用time(NULL),而不是time(0)

或者,您可以在構造函數中調用srand(time(NULL)),然後在roll()中僅使用rand()

+0

-1:這不是(唯一的)問題。 –

+0

我不確定這個-1是否有擔保。根據手冊頁的調用時間用非空參數導致時間存儲在參數的內存地址中。所以我說的是代碼中真正打破的東西是對時間(0)的調用。然後,分別地,他們需要多次調用srand和rand。 –

+0

那麼,真正*被破壞的東西(例如,OP得到意想不到的結果的原因)是'時間'被快速連續調用,因此返回相同的值。但是,我明白你現在從哪裏來,我會刪除downvote。答案並不錯,主要是因爲嵌入「構造函數」中,但這並不是正確的。 –