c ++ std :: Shuffle不是随机的

时间:2016-08-19 11:23:15

标签: c++

有趣的是我制作一个用于改组数组的单例。我试图用std :: shuffle在c ++中对数组进行混洗,但每次运行程序时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

为什么每次程序运行时数组都没有以不同的方式排序?

2 个答案:

答案 0 :(得分:8)

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

getRandomEngine()始终返回具有默认种子的引擎。

答案 1 :(得分:1)

你的getRandomEngine()可能应该返回dre:

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