我有一个程序使用boost :: random的mt19937随机数生成器。我需要做一个random_shuffle,并且希望为此生成的随机数来自这个共享状态,这样他们就可以确定mersenne twister先前生成的数字。
我尝试了这样的事情:
void foo(std::vector &vec, boost::mt19937 &state)
{
struct bar {
boost::mt19937 &_state;
unsigned operator()(unsigned i) {
boost::uniform_int<> rng(0, i - 1);
return rng(_state);
}
bar(boost::mt19937 &state) : _state(state) {}
} rand(state);
std::random_shuffle(vec.begin(), vec.end(), rand);
}但是,我得到一个模板错误,用rand调用random_shuffle。然而这工作:
unsigned bar(unsigned i)
{
boost::mt19937 no_state;
boost::uniform_int<> rng(0, i - 1);
return rng(no_state);
}
void foo(std::vector &vec, boost::mt19937 &state)
{
std::random_shuffle(vec.begin(), vec.end(), bar);
}可能是因为它是一个实际的函数调用。但显然这并不能保持原来的梅森扭曲者的状态。是什么赋予了?有没有办法做我没有全局变量的事情?