質問

私は<のhref = "http://www.johndcook.com/から適応(正規分布、次の番号を生成するための C ++ STD TechnicalReport1 の拡張子が、このコードを使用しようとしていますcpp_TR1_random.htmlの#ノーマル」のrel = "nofollowをnoreferrer">この記事の):

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 "の生成..." を印刷し、メッセージをログに記録し、のループのために終了したことがありません!私は私が代わりにコメントアウト分布を使用している場合は、それが終了したので、私は私が間違ってやって思ったんだけど。任意のアイデア?

どうもありがとうございました!

役に立ちましたか?

解決

これは間違いなく、プログラムをハングアップしないでしょう。しかし、それは本当にあなたのニーズを満たしているかどうかわからない。

 #include <random>
 #include <iostream>

 using namespace std;

 typedef std::tr1::ranlux64_base_01 Myeng; 

 typedef std::tr1::normal_distribution<double> Mydist; 

 int main() 
 { 
      Myeng eng; 
      eng.seed(1000);
      Mydist dist(1,10); 

      dist.reset(); // discard any cached values 
      for (int i = 0; i < 10; i++)
      {
           std::cout << "a random value == " << (int)dist(eng) << std::endl; 
      }

 return (0); 
 }

他のヒント

私はコードもともと投稿と同じ問題を持っていたとのGNUの実装を検討している。

最初のいくつかの観測: 4.4コードがハングアップを使用して、 - G ++と 4.5と

の動作コード上方= C ++ 0X(すなわち、TR1が、本物ではない)-std用い - G ++と

私見、乱数生成と乱数の消費との間のアダプタに関してTR1とC ++ 0Xの間に変化があった - MT19937は整数を生成するが、normal_distributionはダブルスを消費する

C ++ 0X使用適応自動的に、G ++ TR1コードしない

あなたのコード++グラムで作業を取得するために、 - 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();

あなたのTR1乱数生成の実装にバグがある場合は、次のように自分自身の正常な発電機を書き込むことによって、TR1を回避することができます。

2人の制服(0、1)ランダムサンプルuとvはあなたが信頼任意の乱数発生器を使用して生成します。次いでせR = SQRT(-2ログ(U))であり、x = R罪(2パイV)を返します。 (これは、ボックス・ミュラー法と呼ばれている。)

あなたが平均muと標準偏差sigmaの正常サンプルのサンプルが必要な場合は、

、だけではなくXのシグマ* X +ムーを返します。

これはバグのように見える一方で、

、迅速な確認がデフォルト0.0、1.0のパラメータを渡すことであろう。 normal_distribution<double>::normal_distribution()normal_distribution<double>::normal_distribution(0.0, 1.0)を等しくなければならない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top