Как сохранить состояние std :: mersenne_twister_engine, чтобы восстановить его позже?

Я хотел бы сохранить состояние std::mersenne_twister_engine так что я могу восстановить его обратно точно позже. Я знаю, что могу сохранить исходное семя и позвонить discard для вращения двигателя вперед на некоторое количество шагов, но для этого необходимо знать, сколько раз двигатель двигался вперед, не говоря уже о discard кажется неэффективным (O(N)) способ накатить двигатель вперед.

Как мне сохранить точное состояние двигателя?

3

Решение

В соответствии с этот, Движок должен поддерживать сериализацию в и из стандартного потока.

6

Другие решения

Просто сделайте копию этого с помощью конструктора копирования, а затем сделайте присваивание, когда вы хотите восстановить сохраненное состояние (или использовать копию, или как вы хотите структурировать свой код).

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
2

По вопросам рекламы [email protected]