我创建了一个类 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;
我一直得到相同的数字(除了第一个,所以我的重置有点有效)。显然,我没有正确播种。我尝试按照建议添加 reset()
here没有成功。我错过了什么?
最佳答案
通常出错的地方是这样的:
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++ - Boost : Getting same random number . 播种似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38548313/