9

異なるシード番号を使用してランダムシーケンスをリセットしたいと思います。このテストコードを実行する場合:

boost::mt19937 gener(1);
boost::normal_distribution<> normal(0,1);
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal);
cout << rng() << endl;
cout << rng() << endl;
cout << rng() << endl;
gener.seed(2);
cout << rng() << endl;
cout << rng() << endl;
gener.seed(1);
cout << rng() << endl;
gener.seed(2);
cout << rng() << endl;
gener.seed(3);
cout << rng() << endl;

次の出力が得られます。

# seed(1) via constructor
-2.971829031
1.706951063
-0.430498971
# seed(2)
-2.282022417
-0.5887503675
# seed(1)
0.2504171986
# seed(2)
-0.5887503675
# seed(3)
0.2504171986

明らかに、私は非常に間違ったことをしています。この問題をどのように克服できますか?

4

4 に答える 4

14

ジムに続いて、アランとイゴールの提案はコードにいくつかの変更を加えました:rng.engine().seed()の代わりにgener.seed()、へrng.distribution().reset()の呼び出しの後に呼び出されrng.engine().seed()、それは魅力のように機能しました。

どうもありがとう!

于 2011-01-25T03:30:45.600 に答える
5

gener.seed()を呼び出した後、normal.reset()を呼び出す必要があります。これは、normalの出力がgenerからの以前の出力に依存しないようにするために指定されています。

(ディストリビューションはおそらく、クリアする必要のある状態をキャッシュしています。)

于 2011-01-24T17:42:16.167 に答える
1

私はあなたのオブジェクトboost::variate_generator<>のコピーを作成すると信じています。boost::mt19937 generしたがって、のコピーを再シードしても、すでに作成されているオブジェクトgenerには影響しません。再シードするたびrngに新しいオブジェクトを作成すると、必要な動作が得られるはずです(免責事項:テストされていません!)rng

于 2011-01-24T06:11:22.277 に答える
1

問題が解決したことを確認できてうれしいです。しかし、私はアランの方法がうまくいかない理由を理解したと思います...

を書くとき、それは参照による呼び出しであるため、のboost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal)別のコピーを作成しませんでした、を使用しての別のコピーを作成しました。genernormalvariate_generate

したがってnormal.reset、元のをリセットするだけのの代わりに、をnormal使用する必要がありますrng.distribution().reset()。ただし、そのままにしておくことができます。gener.seed()これは、と同じ効果があると思いrng.engine().seed()ます。

コードでテストしたところ、期待どおりに機能しました。

まあ、誰かが気にする場合に備えて:)

于 2012-08-17T07:28:26.617 に答える