2017-08-28 65 views
2
//My trial program 
#include<iostream> 
#include<random> 

using namespace std; 

int main(){ 

    //USed to initialize (seed) the random number generator 
    random_device sd{}; 

    // The random number generator 
    mt19937 engine {sd()}; 

    //Uniformly distribute random numbers in [1...10] 
    uniform_int_distribution <> dis{1, 50}; 

    //Generate a random integer 
    int x {dis(engine)}; 

    //Print it 

    cout<<x<<"\n"; 

    return 0; 

} 

我已經使用上面的代碼來生成1到50之間的隨機數。但是每當我運行程序時,生成的隨機數都是相同的。我正在學習的在線課程有這段代碼,它在教師的clang編譯器上工作得很好。我正在使用gcc編譯器。任何人都可以告訴我需要做什麼嗎?謝謝!!C++ 11個隨機數生成不起作用

+0

不斷更改種子 –

+0

mt19937 engine {sd()};這裏的任何蘭幣值 –

+1

您是否有機會使用MinGW?對於'std :: random_device',這有或曾經有過一些麻煩。 –

回答

1

這裏的問題是,std::random_device並不一定是一個真正的隨機設備。它可以是一個非種子rand的包裝,每次使用時都會給你相同的值。這意味着你的種子engine將是相同的,這意味着它產生的僞隨機序列也是一樣的。你能解決這個

的一種方法是使用電流作爲種子像

auto seed = std::chrono::system_clock::now().time_since_epoch().count(); 
mt19937 engine {seed}; 

但也可以通過外部流程來操作,而不是非常罰款晶在同一時間播種那麼多實例都可以做出相同的順序。

+0

如何解決此限制,使其生成僞隨機碼? – AbhiJoe

+0

@AbhiJoe給它加上時間戳。 – zett42

+0

@AhiJoe剛剛更新了答案 – NathanOliver

2

std::random_device

的std :: random_device可以實現定義的僞隨機數引擎方面來實現,如果非確定性源(例如,硬件設備)不可用於執行。 在這種情況下,每個std :: random_device對象可能會生成相同的數字序列。

儘管它對用戶來說並不理想,但實現允許您具有所描述的行爲。