7

C# でガウス分布の乱数を生成するメソッドを作成したいと考えています[0:1](事前に [0-x] で) 。このコードを見つけましたが、正しく動作しません

Random rand = new Random(); //reuse this if you are generating many
double u1 = rand.NextDouble(); //these are uniform(0,1) random doubles
double u2 = rand.NextDouble();
double randStdNormal = Math.Abs( Math.Sqrt(-2.0 * Math.Log(u1)) * 
                                 Math.Sin(2.0 * Math.PI * u2));
4

2 に答える 2

4

特定の分布で乱数を生成する方法に関するブログ投稿を書きました。

http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

要約すると、必要なアルゴリズムは次のとおりです。

  1. 曲線の一部の下の面積が、その範囲内で値がランダムに生成される確率と等しくなるように、目的の確率分布関数を計算します。
  2. 確率分布を積分して累積分布を求めます。
  3. 累積分布を反転して分位関数を取得します。
  4. 変位値関数を実行して、(0,1) に一様分布のランダム データを変換します。

もちろん、目的の分布の分位点関数が既にわかっている場合は、手順 1 ~ 3 を実行する必要はありません。

于 2013-04-12T15:06:36.307 に答える
2

0 と 1 の間の正規分布 (ガウス) 乱数のジェネレーターが必要だとします。

まず、正規分布は制限されていません...例に示す関数は、平均が0.0、標準偏差が1.0の正規分布乱数を生成します

この関数から取得した値に目的の標準偏差を掛けてから、目的の平均を加算することにより、任意の平均および標準偏差の正規分布ランダム値を生成できます...

コードはそのままで問題ありません - 問題は -inf から +inf の範囲を持つガウス (正規) 分布の誤解です...

約 2/3 の確率で、得られる値は +/- 1 標準偏差の間になります..約 95% の確率で、値は +/1 と標準偏差の 3 倍の間になります...

于 2014-11-15T17:05:25.177 に答える