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