質問

私は平均0、シグマ1の正規分布を生成するために、ブースト:: normal_distributionを使用しようとしている。

次のコードは、いくつかの値は、上または超え-1及び1であるように動作しない(とすべきではありません)。 someont私が間違っているのかを指し示してもらえますか?

#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>

int main()
{
  boost::mt19937 rng; // I don't seed it on purpouse (it's not relevant)

  boost::normal_distribution<> nd(0.0, 1.0);

  boost::variate_generator<boost::mt19937&, 
                           boost::normal_distribution<> > var_nor(rng, nd);

  int i = 0; for (; i < 10; ++i)
  {
    double d = var_nor();
    std::cout << d << std::endl;
  }
}

私のマシン上の結果は、次のとおりです。

0.213436
-0.49558
1.57538
-1.0592
1.83927
1.88577
0.604675
-0.365983
-0.578264
-0.634376

あなたが見ることができるように、すべての値が-1と1の間ではありません。

事前にあなたのすべてをありがとうございました!

編集:これは、あなたが締め切りを持って練習を行う前に、理論を勉強避けるときに起こることです。

役に立ちましたか?

解決

  

次のコードは、いくつかの値は、上または超え-1及び1であるように動作しない(とすべきではありません)。 someont私が間違っているのかを指し示してもらえますか?

いいえ、これは正規分布の標準偏差(コンストラクタの2番目のパラメータ 1 )の誤解である。

正規分布は、使い慣れた釣鐘曲線です。その曲線は、効果的にあなたの値の分布を伝えます。ベル曲線のピークは遠く離れた値(分布のテール)よりも可能性がある場所に近い値。

標準偏差は値が広がってどのように伝えます。数より小さく、より濃縮値は平均値を中心にしています。より多く、低濃度の値は平均値の周りにあります。下の画像では、赤の曲線が0.2の分散(分散が標準偏差の二乗である)を有していることがわかります。同じ平均が、1.0の分散を持つ緑の曲線にこれを比較してください。あなたは緑の曲線の値がより赤い曲線に対して広がっていることがわかります。紫の曲線は、分散5.0を持っており、値がさらに広がっている。

値が[-1, 1]に限定されない理由

ですから、これは説明します。しかし、値の68%が、平均値の1つの標準偏差内常にあることは興味深い事実です。だから、あなた自身のための興味深いテストとして、平均0、分散1の正規分布から多数の値を描画し、平均値の1つの標準偏差内にある数をカウントするプログラムを作成。あなたが(もう少し正確に68.2689492137%)68%に近い番号を取得する必要があります。

altテキスト

1 :ブースト<のhref = "からhttp://www.boost.org/doc/libs/1_35_0/libs/math/doc/sf_and_dist/html/math_toolkit/dist/ dist_ref / distsディレクトリ/ normal_dist.html」のrel = "nofollowをnoreferrer">ドキュメントでます:

  

normal_distribution(RealType mean = 0, RealType sd = 1);

     

は、平均値と標準偏差SD平均の正規分布を作成します。

他のヒント

あなたは何も悪いことをやっていません。正規分布の場合、シグマは標準を指定します 偏差ない範囲。あなたは十分なサンプルを生成する場合、あなたはたったの約ていることがわかります それらの68%の範囲にある - 2シグマ内、[平均+シグマ平均、σは約95%を、 3シグマ以内に99%以上

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