2016-08-19 47 views
-1

爲了好玩,我製作了一個用於洗牌數組的單例。我試圖在C++中用std :: shuffle洗牌數組,但每次運行程序時洗牌都會產生相同的結果。C++ std :: Shuffle不是隨機的

代碼:

// Example program 
#include <iostream> 
#include <string> 
#pragma once 
#include <memory> 
#include <random> 
#include <ctime> 
#include <algorithm> 


class RandomPicker 
{ 
public: 
    ~RandomPicker(); 
    std::default_random_engine getRandomEngine(); 
    static std::shared_ptr<RandomPicker> getInstance(); 
private: 
    std::default_random_engine dre = std::default_random_engine(time(0)); 
    RandomPicker(); 
    static std::shared_ptr<RandomPicker> instance; 
}; 


std::shared_ptr<RandomPicker> RandomPicker::instance = nullptr; 

RandomPicker::RandomPicker() 
{ 
} 


RandomPicker::~RandomPicker() 
{ 
} 

std::default_random_engine RandomPicker::getRandomEngine() 
{ 
    return std::default_random_engine(); 
} 

std::shared_ptr<RandomPicker> RandomPicker::getInstance() 
{ 

    if (instance == nullptr) 
    { 
     instance.reset(new RandomPicker); 
    } 
    return instance; 
} 



int main() 
{ 
    std::array<int,5> foo {1,2,3,4,5}; 

    std::shared_ptr<RandomPicker> r = RandomPicker::getInstance(); 
    shuffle (foo.begin(), foo.end(), r->getRandomEngine()); 


    std::cout << "shuffled elements:"; 
    for (int& x: foo) std::cout << ' ' << x; 
    std::cout << '\n'; 


} 

Link to code showing it:

我想用

std::default_random_engine dre = std::default_random_engine(time(0)); 
//notice the time(0) 

會得到不同的結果每次,但結果等於。

混洗元素:3 1 5 4 2

爲什麼陣列不在每次程序運行以不同的方式來分類?

+0

可能重複的:性病:: default_random_engine generato值介乎0.0和1.0(http://stackoverflow.com/questions/15461140/stddefault-隨機發動機generato值-愨-0-0和-1-0)。 *「我認爲每次使用[time(0)]會得到不同的結果,但結果等於'洗牌元素:3 1 5 4 2'」 - 對我來說,它會產生不同的結果(如預期的那樣)。你確定你已經重新編譯了這個程序嗎? – soon

+0

@soon是我也在網上得到結果 –

+0

我已經改變了你的'getRandomEngine',現在它按預期工作:[http://cpp.sh/5di4](http://cpp.sh/5di4) – soon

回答

8
std::default_random_engine RandomPicker::getRandomEngine() 
{ 
    return std::default_random_engine(); 
} 

getRandomEngine()總是返回一個帶默認種子的引擎。

1

你getRandomEngine()應可能返回DRE:

std::default_random_engine RandomPicker::getRandomEngine() 
{ 
    return dre; 
}