9

C++ STD TechnicalReport1拡張機能を使用して、正規分布に従って数値を生成しようとしていますが、このコード (この記事から適応):

mt19937 eng;
eng.seed(SEED);

normal_distribution<double> dist;
// XXX if I use the one below it exits the for loop
// uniform_int<int> dist(1, 52);

for (unsigned int i = 0; i < 1000; ++i) {
  cout << "Generating " << i << "-th value" << endl;
  cout << dist(eng) << endl;
}

1 つの「生成中...」ログ メッセージのみを出力し、for ループを決して終了しません。代わりにコメントアウトしたディストリビューションを使用すると、終了するので、何が間違っているのか疑問に思っています。何か案が?

どうもありがとう!

4

4 に答える 4

7

私は最初に投稿されたコードで同じ問題を抱えており、のGNU実装を調査しました

最初のいくつかの観察:g ++-4.4でコードを使用するとハングし、g++-4.5で-std= c ++ 0x(つまり、TR1ではなく本物)を使用すると、上記のコードは機能します

IMHO、乱数の生成と乱数の消費の間のアダプターに関して、TR1とc ++ 0xの間に変更がありました-mt19937は整数を生成し、normal_distributionは2倍を消費します

c ++ 0xは自動的に適応を使用しますが、g++TR1コードは使用しません

コードをg++-4.4およびTR1で動作させるには、次のようにします

std::tr1::mt19937 prng(seed);
std::tr1::normal_distribution<double> normal;
std::tr1::variate_generator<std::tr1::mt19937, std::tr1::normal_distribution<double> > randn(prng,normal);
double r = randn();
于 2010-11-24T11:22:47.107 に答える
2

TR1 乱数生成の実装にバグがある場合は、次のように独自の通常のジェネレーターを作成することで TR1 を回避できます。

信頼できる任意の乱数発生器を使用して、2 つの一様 (0, 1) ランダム サンプル u および v を生成します。次に、r = sqrt( -2 log(u) ) とし、x = r sin(2 pi v) を返します。(これをボックスミューラー法といいます。)

平均 mu と標準偏差 sigma を持つ通常のサンプル サンプルが必要な場合は、x だけでなく sigma*x + mu を返します。

于 2009-09-04T01:54:42.833 に答える
1

これはバグのようですが、デフォルトの 0.0、1.0 パラメータを渡すことで簡単に確認できます。normal_distribution<double>::normal_distribution()等しいはずですnormal_distribution<double>::normal_distribution(0.0, 1.0)

于 2009-07-13T10:17:49.727 に答える