随机生成器,种子不工作

时间:2015-11-01 23:02:26

标签: c++ random

我想创建一个类,只要我调用它就会返回一个随机数。但是当我将它放入循环时,它每次都返回相同的随机数。我播种了一次,但它仍然一遍又一遍地返回同一个。它只有当我关闭程序并再次打开它时才会有所不同。任何帮助将不胜感激。

**编辑

当我无法看到我每次都在调用它时。

  RadomGenerator rg = new...
for(int i =0; i<10; i++){
     rg.createRandomNumber(1,5);}

这是不是只对种子进行一次实现,然后多次调用createRandomNumber方法?

 RandomGenerator::RandomGenerator()
{
seed = time(0);
}

int RandomGenerator::createRandomNumber(int start, int end)
{

std::function<int()> randomNumber = std::bind(std::uniform_int_distribution<int>(start,end),
                                      mt19937(seed));
qDebug()<< "result" << randomNumber() ;
return randomNumber();

}

2 个答案:

答案 0 :(得分:5)

你每次都播种它。

#include <random>

struct RandomGenerator {
    std::mt19937 _engine;
    std::uniform_int_distribution<int> _dist;

    RandomGenerator(int start, int end) 
        : _engine { std::random_device{} () },
          _dist(start, end)
    {
    }

    int createRandomNumber()
    {
        return _dist(_engine);
    }

};

请注意,为单个调用创建uniform_*_distribution的实例实际上没用。

更不用说,将其包装在function<>

您通常可以使用

auto mygen = bind(, );

而不是整个班级,并使用它:

int this_is_random = mygen();

在C ++ 14中:

auto mygen = [ _engine = mt19937{ random_device{}() }, _dist = uniform_int_distribution<>(12, 42) ]() mutable {
    return _dist(_engine);
};

查看 Live On Coliru

答案 1 :(得分:0)

  

这是不是只对种子进行一次实现,然后多次调用createRandomNumber方法?

没有。在这一行中,您每次使用相同的mt19937实例化seed

std::function<int()> randomNumber = std::bind(std::uniform_int_distribution<int>(start,end),
                                  mt19937(seed));