给定范围作为输入,我创建了一个类MyRandom以使模具在均匀分布上滚动:

MyRandom.cpp

#include "MyRandom.h"

MyRandom::MyRandom(){
    gen.seed(static_cast<unsigned int>(std::time(0)));
}


int MyRandom::die(int min, int max){

    boost::uniform_int<> dist(min, max);
    boost::variate_generator<boost::mt19937&, boost::uniform_int<> > role(gen, dist);
    int result = role();
    role.engine().seed();
    role.distribution().reset();
    return result;
}


main.cpp

std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;


我一直得到相同的号码(第一个号码除外,因此我的重设有些起作用)。显然,我没有正确地植入种子。我尝试按照建议的here添加reset(),但未成功。我想念什么?

最佳答案

通常出错的是这样的:

std::generate_n(out_iterator, 10, my_random);


这将复制带有状态的my_random对象。 lambdas可能发生相同的事情:

MyRandom my_random;
std::generate_n(out_iterator, 10, [=] { return my_random.die(0,8); });


您想要的是通过裁判传递引擎,或者

std::generate_n(out_iterator, 10, std::ref(my_random));


要么

MyRandom my_random;
std::generate_n(out_iterator, 10, [&my_random] { return my_random.die(0,8); });

关于c++ - C++-Boost:获取相同的随机数。播种似乎无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38548313/

10-13 09:41