boost::randomのmt19937乱数ジェネレーターを使用するプログラムがあります。random_shuffleを実行する必要があり、これに対して生成される乱数をこの共有状態から取得して、メルセンヌツイスターの以前に生成された数に対して決定論的であるようにする必要があります。
私はこのようなことを試みました:
void foo(std::vector<unsigned> &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<unsigned> &vec, boost::mt19937 &state)
{
std::random_shuffle(vec.begin(), vec.end(), bar);
}
おそらくそれは実際の関数呼び出しだからです。しかし、明らかにこれは元のメルセンヌツイスターからの状態を維持しません。何が得られますか?グローバル変数なしで私がやろうとしていることをする方法はありますか?