Я хотел бы сохранить состояние std::mersenne_twister_engine
так что я могу восстановить его обратно точно позже. Я знаю, что могу сохранить исходное семя и позвонить discard
для вращения двигателя вперед на некоторое количество шагов, но для этого необходимо знать, сколько раз двигатель двигался вперед, не говоря уже о discard
кажется неэффективным (O(N)
) способ накатить двигатель вперед.
Как мне сохранить точное состояние двигателя?
В соответствии с этот, Движок должен поддерживать сериализацию в и из стандартного потока.
Просто сделайте копию этого с помощью конструктора копирования, а затем сделайте присваивание, когда вы хотите восстановить сохраненное состояние (или использовать копию, или как вы хотите структурировать свой код).
int main()
{
mtt19937 engine(10);
std::cout
<< engine() << "\n"<< engine() << "\n"<< engine() << "\n"<< engine() << "\n"<< engine() << "\n\n";
std::cout << "Making Copy\n\n";
mtt19937 copy(engine);
std::cout
<< engine() << "\n"<< engine() << "\n"<< engine() << "\n"<< engine() << "\n"<< engine() << "\n";
std::cout << "----\n";
engine = copy;
std::cout
<< engine() << "\n"<< engine() << "\n"<< engine() << "\n"<< engine() << "\n"<< engine() << "\n";
}
Выход:
266666648
1113235983
1006007037
1572197236
322379391
Making Copy
1241299006
1359151196
1840219852
755708724
110209057
----
1241299006
1359151196
1840219852
755708724
110209057