2009-03-10 6 views
6

Random.nextGaussian()は、平均0と標準偏差1のランダムなnoを返すと仮定されています。 生成された数は、[-1、+ 1]の範囲外です。 どのように正規分布した乱数を-1から1までの範囲で与えるように設定することができますか。Random.nextGaussian()の問題

答えて

17

平均0と標準偏差1のガウス分布は、分布の平均が0であり、母集団の約70%が[-1,1]の範囲にあることを意味します。あなたの範囲外の数字は無視してください - 両脇の約16%の縞を形成します。

おそらくもっと良い解決策は、mean=0std.dev=0.5で分布を生成することです。これは[-1、1]の範囲の値の約96%の分布を与えます。

さらに優れた解決策は、上記のように後ろ向きに作業し、値の99.7%が3シグマ範囲にある:std.dev = 1/3を使用する。それはあなたが得ている有用ではない価値の量をほぼ無効にします。あなたがそれを得るとき、それを省略してください。

もちろん、数学的に集中的な製品を扱っている場合、これはすべて価値がありません。

+3

もちろん、それらの数字を無視することを除いて、あなたのランダムな値は本当にもう正常ではありませんか? –

+1

この定義では、任意の乱数ジェネレータでクランプするとバイアスが導入されます。 – dirkgently

+0

@dirkgently:絶対に。これは正規分布ではなく、正規分布に「非常に似ている」ものです。 –

6

正規分布では、外に値を見る確率はゼロではありませんが、 -1、+1]あなたはどのような分散を与えても、効果的にカーブを縮めているだけです。

小さい分散を使用して、-1から-1、および1対1よりも大きいものを切り取ったマップで結果を実行することはできますが、厳密には通常のそれ以上の分布。

この配信は何のために必要ですか?

+1

それほど小さくはありません。値の30%近くが1標準偏差の外になければならない。 5%のようなものは2標準偏差の外にあるでしょう。 –

+0

「極端に小さくなっている」とは、平均から遠ざかるにつれて、値を生成する確率は小さくなりますが、それでもゼロではないことを意味しています。 –

+0

私は統計解析プログラムを実装しています。それは通常の逸脱を使用します。 – BHS

10

通常の分布には、平均から任意に遠いが、確率はますます小さくなる数字は含まれていませんか?あなたの欲望(正常かつ特定の範囲に限定されている)が両立していない可能性があります。

1

標準偏差が1.0の場合、多くの値が[-1,1]の範囲外になります。

この範囲内にする必要がある場合は、別の方法、おそらくnextDouble()を使用する必要があります。

2

パラメータを使用したガウス分布。密度e ^( - x^2/2)を有する。一般的には、e ^(線形(x)+線形(x^2))という形式です。これはあなたが設定したものであれば、非常に大きくて非常に小さい数を得る可能性があります。
あなたはおそらく他の配布物を探しています。

0

このコードでは、個の数字の個のランダムなガウス数がコンソールに表示され(10行目)、その後統計情報(最低、最高、平均)が表示されます。

の数値がの場合、乱数は[-1.0 ... +1.0]の範囲にあり、平均は[-0.1 ... +0.1]の範囲になります。しかし、のカウントがの場合、乱数は[-4.0 ... +4.0]の範囲になります(両者には数字が表示される可能性があります)が、平均値は[-0.001 ... + 0.001](0に近づく)。

public static void main(String[] args) { 
    int count = 20_000; // Generated random numbers 
    double lowest = 0; // For statistics 
    double highest = 0; 
    double average = 0; 
    Random random = new Random(); 

    for (int i = 0; i < count; ++i) { 
     double gaussian = random.nextGaussian(); 
     average += gaussian; 
     lowest = Math.min(gaussian, lowest); 
     highest = Math.max(gaussian, highest); 
     if (i%10 == 0) { // New line 
      System.out.println(); 
     } 
     System.out.printf("%10.4f", gaussian); 
    } 
    // Display statistics 
    System.out.println("\n\nNumber of generated random values following Gaussian distribution: " + count); 
    System.out.printf("\nLowest value: %10.4f\nHighest value: %10.4f\nAverage:  %10.4f", lowest, highest, (average/count)); 
} 
関連する問題