2011-01-15 9 views
7

Iはscipyのダウンロードとnumpyの持っている、私の間の乱数を使用して(を含む)100-60,000を、長さ300万の1次元配列を作成する必要がパイソン3.1 - 正規分布を作成

のPython V3.1。それは正規分布に適合しなければならない。 A '= numpy.random.standard_normal(3000000)' を使用

、私は必要な長さのために正規分布を取得します。必要な範囲を達成する方法がわからない

+0

ができますすることができます - エッジケースを確認してください:あなたはので、四捨五入のカットオフ50%のヒットを有することができます! 10000の数字を生成し、それぞれの発生数を数えます。それらは、多かれ少なかれ同等でなければなりません。 'ラウンド(random.uniform(-0.5、100 + 0.5))' ' – kolypto

答えて

10

標準正規分布は、私はあなたの要件から理解どのような0と標準偏差1を意味しています((60000から100)/ 2、(60000から100)/ 2)いずれかが必要ということです。それぞれの値をstandard_normal()結果、multiply it by the new variance, and add the new meanから取ってください。

私はnumpyのを使用していないが、ドキュメントのクイック検索は、あなたがnumpy.random.normal()

最後の一つちらほらを使用府直接欲しいものを達成できることを言う:正規分布が制限されていません。つまり、確率ゼロの値はありません。あなたの要件は、限界ではなく、平均と分散(または標準偏差)の観点からのものでなければなりません。

+0

おっと、これが存在していたことに気付かなかった、+1、私の方法ではなくこの方法を使う。 – fmark

+0

ありがとう!私の頭をぐるぐる回したが、私はそこに着いた。いくつかの基本的な統計を理解することと同様にプログラミング上の問題。乾杯。 – jimy

+0

しかし、しばしば、範囲の形で値を見つけてそこに正規分布を入れたいだけです。何かの要件である必要はありません。それでは、あなたはどのように新しい分散_と_新しい_を見つけますか?平均値はおそらくほとんどの値が必要な値ですが、分散はどうですか? – Zelphir

-4

この素敵な小さなメソッドを試してみてください。

ただ1つの乱数を作る方法が必要です。

import random 
list = [random.randint(min,max) for i in range(numitems)] 

これは、minitとmaxの間のnumitems乱数のリストを提供します。もちろん

、3000000は、メモリ内に持っているアイテムがたくさんあります。プログラムが必要とする乱数を作成することを検討してください。

+0

random.randrange'が正規分布を作成しません:ここで0..100で' uniform'分布のエッジケースを克服する例を示します。また、OPはリストではなくNumPy配列を要求しています。 – Amber

6

あなたが本当にランダムな正規分布をしたい場合は、数字が広がっていくどこまでguarenteeすることはできません。あなたは、標準偏差が唯一の1/6または1/7の半分の範囲は、あなたに合理的なを与えることを保証すること、この場合には、

>>> n = 3000000 
>>> sigma5 = 1.0/1744278 
>>> n * sigma5 
1.7199093263803131 # Expect one values in 3 mil outside range at 5 stdev. 
>>> sigma6 = 1.0/1/506800000 
>>> sigma6 = 1.0/506800000 
>>> n * sigma6 
0.0059194948697711127 # Expect 0.005 values in 3 mil outside range at 6 stdev. 
>>> sigma7 = 1.0/390600000000 
>>> n * sigma7 
7.6804915514592934e-06 

したがって、標準偏差を指定することで、しかし、外れ値の確率を減らすことができますあなたのデータがその範囲を超えないという確信。もちろん

>>> range = 60000 - 100 
>>> spread = (range/2)/6 # Anything outside of the range will be six std. dev. from the mean 
>>> mean = (60000 + 100)/2 
>>> a = numpy.random.normal(loc = mean, scale = spread, size = n) 
>>> min(a) 
6320.0238199673404 
>>> max(a) 
55044.015566089176 

あなたが整数を必要とする場合、あなたはまだここに範囲外の値

+1

私は上記で使用しましたが、コメントは本当に理解に役立ちました。ありがとう! – jimy

関連する問題