0

Looking at some legacy code in our app, found this weird implementation of Normal RNG. I want to swap it for a proper Box-Muller transformation but need some encouragement.

As you can see, it generates 5 random numbers from -3.875 to +3.875 and then averages them out to get a quasi-normally distributed value from -1 to +1. Can this possibly be right? How can this even work? Why 5 samples?

Someone, please explain this:

private double GetRandomNormalNumber()
    {
      const double SPREAD = 7.75;
      const double HALFSPREAD = 3.875;
      var random = new Random();

      var fRandomNormalNumber = ((random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD)
                                )/5;

      return fRandomNormalNumber;
    }
4

2 に答える 2

2

中心極限定理の結果として、いくつかのランダムな一様サンプルを平均して正規分布を近似することが標準です。通常、12 個のサンプルが取得されます。あなたの場合、おそらく効率のために、誰かが 5 つのサンプルだけを取得することにしました。

C/C++ で正規分布に従って乱数を生成するをご覧ください。

于 2013-03-12T15:17:49.343 に答える
1

コードは正しいように見えます。0.0付近の領域が範囲の端(-HALFSPREAD、HALFSPREAD)よりも高い確率になるだけです。

5つの数値が適切に計算された値であるとは思えません。おそらく、「機能するため」に選択されたものです。

あるRNGを別のRNGに置き換える場合は、次のことができるはずです。置き換えの実用的な特性が優れている限り、既存のRNGからの特定の出力に依存する必要はありません。

于 2013-03-12T15:20:49.227 に答える