У меня есть программа, которая использует генератор случайных чисел mt19937 из boost:: random. Мне нужно сделать random_shuffle и хотите, чтобы случайные числа, созданные для этого, были из этого общего состояния, чтобы они могли быть детерминированными по отношению к ранее сгенерированным числам mersenne twister.
Я пробовал что-то вроде этого:
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);
}
Но я получаю шаблонную ошибку, вызывающую random_shuffle с rand. Однако это работает:
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);
}
Вероятно, потому что это фактический вызов функции. Но, очевидно, это не удерживает государство от оригинального mersenne twister. Что дает? Есть ли способ сделать то, что я пытаюсь сделать без глобальных переменных?