Как мне переключиться между локальными и глобальными настройками для начального состояния C++11 RNG?
В приведенном ниже коде я хотел бы реализовать флаг (или что-то такое же простое), который имеет тот же эффект, что и закомментирование локальных настроек, и использование глобальных настроек несколько раз (в этом примере получаются два разных числа) и использование местная настройка в другое время (в этом примере получаются два одинаковых номера).
Я безуспешно пробовал очевидные структуры "если" и "переключать".
#include <iostream>
#include <random>
void print();
std::seed_seq seed{1, 2, 3, 4, 5};
std::mt19937 rng(seed); // *global* initial state
std::uniform_real_distribution<> rand01(0, 1);
int main()
{
print();
print();
return 0;
}
void print()
{
std::mt19937 rng(seed); // *local* initial state
std::cout << rand01(rng) << std::endl;
}
1 ответ
Используйте троицу и ссылку:
std::mt19937& ref = flag ? rng : local;
Вот, flag
это условие для тестирования, rng
является "глобальным" случайным объектом, и local
является более локализованным.
Привязка ссылки к результату троичного синтаксически допустима: вы не можете сделать это, используя if
оператор или аналогичные, поскольку они не являются выражениями правильного типа.
С этого момента используйте ref
, Это будет действовать до тех пор, пока rng
а также local
оставаться в сфере.