我想保存一个std::mersenne_twister_engine
的状态,以便我可以在以后再将其恢复。我知道我可以拯救原始的种子,并呼吁discard
推动发动机前进一些步骤,但这需要知道发动机的先进次数,更不用说discard
似乎是一个低效率(O(N)
)的方式来滚动发动机前进。如何保存std :: mersenne_twister_engine的状态以便稍后恢复?
我该如何去拯救引擎的确切状态?
我想保存一个std::mersenne_twister_engine
的状态,以便我可以在以后再将其恢复。我知道我可以拯救原始的种子,并呼吁discard
推动发动机前进一些步骤,但这需要知道发动机的先进次数,更不用说discard
似乎是一个低效率(O(N)
)的方式来滚动发动机前进。如何保存std :: mersenne_twister_engine的状态以便稍后恢复?
我该如何去拯救引擎的确切状态?
根据this,引擎应该支持序列化进出标准流。
只需使用复制构造函数复制它,然后在想要恢复保存的状态(或使用复制或无论您想要构造代码)时进行分配。
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
感谢您的答复;我正在考虑更多地将引擎保存到磁盘或从磁盘保存引擎,但这很好理解。 – fbrereto
糟糕,误解了你的问题。很高兴你找到答案。 – 2013-05-21 20:54:21