乱数発生器の状態に関する問題に遭遇しました。具体的には、保存されたエンジン状態が復元されると、わずかにずれている一連の乱数が生成されます。いずれの場合も、復元されたシーケンスは 1 つ上または下にシフトされているように見えます。例えば:
1. Create bivariate generator with an MT19937 engine and a standard uniform distribution.
2. Generate some random normal variables.
3. Save the state of the engine. I'll call it state 1.
4. Generate and keep track of the next 5 random normal variables.
5. Repeat steps 2 to 4 to obtain a state 2 and then a state 3.
観測結果 (説明のみ):
State 1
Actual Restored state (appears to have shifted up)
a b
b c
c d
d e
e f
State 2
Actual Restored state (appears to have shifted down)
j i
k j
l k
m l
n m
State 3
Actual Restored state (appears to have shifted up again)
r s
s t
t u
u v
v w
コード:
boost::mt19937 engine(seed);
boost::normal_distribution<double> dd(0, 1);
boost::variate_generator<boost::mt19937&, boost::normal_distribution<double>> rr(engine, dd);
std::stringstream ss1; std::stringstream ss2; std::stringstream ss3;
for (long p=0; p<20; p++) {rr();}
ss1 << engine;
for (long p=0; p<5; p++) {
std::cout << rr() << "\n"; // keep track of these
}
// repeat for states 2 and 3, i.e., ss2 and ss3
ss1 >> engine;
for (long p=0; p<5; p++) {
std::cout << rr() << "\n"; // compare with the above numbers
}
// repeat for states 2 and 3
私の Boost バージョンは 1.47.0 で、64 ビット Windows 用の VS2010 でコードをコンパイルしています。これらの保存された状態を「再調整」するためのアドバイスをいただければ幸いです。ありがとう!