2016-08-19 74 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; 
}