C ++ TR1:normal_distributionを使用する方法?
-
12-09-2019 - |
質問
私は<の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)
を等しくなければならない。