ブースト乱数ジェネレーターをアダプター クラスでラップして、モンテカルロ ルーチンを実装しています。クラスのメンバー関数で単体テストを作成するとき、.discard(unsigned int N) の動作は N 個の乱数を格納せずに描画し、rng の状態を進めることであると想定しました。ブーストコードは次のとおりです。
void discard(boost::uintmax_t z)
{
if(z > BOOST_RANDOM_MERSENNE_TWISTER_DISCARD_THRESHOLD) {
discard_many(z);
} else {
for(boost::uintmax_t j = 0; j < z; ++j) {
(*this)();
}
}
}
これは私の仮定を支持します。ただし、 .discard(1) の結果のシーケンスは、破棄のない同じシーケンスと 1 つの違いではないことがわかりました。コード:
#include <iostream>
#include <iomanip>
#include <random>
#include <boost/random.hpp>
int main()
{
boost::mt19937 uGenOne(1);
boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > distOne(uGenOne, boost::normal_distribution<>());
boost::mt19937 uGenTwo(1);
boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > distTwo(uGenTwo, boost::normal_distribution<>());
distTwo.engine().discard(1);
unsigned int M = 10;
std::vector<double> variatesOne(M);
std::vector<double> variatesTwo(M);
for (unsigned int m = 0; m < M; ++m) {
variatesOne[m] = distOne();
variatesTwo[m] = distTwo();
}
for (unsigned int m = 0; m < M; ++m)
std::cout << std::left << std::setw(15) << variatesOne[m] << variatesTwo[m] << std::endl;
return 0;
}
出力
2.28493 0.538758
-0.668627 -0.0017866
0.00680682 0.619191
0.26211 0.26211
-0.806832 -0.806832
0.751338 0.751338
1.50612 1.50612
-0.0631903 -0.0631903
0.785654 0.785654
-0.923125 -0.923125
.discard の動作についての私の解釈は間違っていますか? 2 つのシーケンスの最初の 3 つの出力が異なり、その後は同一になるのはなぜですか?
(このコードは、msvc 19.00.23918 および cygwin の g++ 4.9.2 でコンパイルされ、同じ結果が得られました)。