ページへ戻る

− Links

 印刷 

Python​/正規分布に従う乱数を生成する のバックアップ差分(No.2) :: NJF Wiki

xpwiki:Python/正規分布に従う乱数を生成する のバックアップ差分(No.2)

« Prev[4]  Next »[5]
1: 2019-04-08 (月) 03:37:38 njf[6] ソース[7] バックアップ No.1 を復元して編集[8]
With "attach" plugin. (Created empty)
2: 2019-04-08 (月) 04:43:50 njf[6] ソース[9] バックアップ No.2 を復元して編集[10]
Line 1: Line 1:
 +Pythonでは正規分布(ガウス分布)に従う乱数を発生させる方法が標準で提供されています。
 +普通の一様な乱数よりは使用頻度は低いものの、正規分布は誤差などで自然に現れる確率分布で、統計の分野では非常に重要な分布です。
 +
 +そのため、統計関係のテストデータの作成などにこの機能が使えます。
 +
 +また、グラフィックなどで自然な形で集中したランダムな点を描画したい時や、ゲームで弾の照準に誤差を入れたいときなどにも使えます。
 +
 +自分で実装するのもそう難しくはないのですが、少し面倒なので標準で使えるのは便利です。
 +
 +&font(u){注意};:Pythonの正規分布の上側確率などを求める方法は[[Python/標準正規分布]]で紹介しています。
 +
 +生成するにはrandom.gaussを使います。
 +例えば、標準正規分布に従う乱数を生成するには以下のようにします。
 +
 + import random
 +
 + print(random.gauss(0,1))
 +
 +結果:
 + -1.5001413318395698
 +
 +など。
 +
 +第一引数が平均値で第二引数が標準偏差です。
 +
 +他にほぼ同様のメソッドとしてrandom.normalvariateがあります。
 +
 +使い方も全く同じで第一引数が平均値で第二引数が標準偏差です。
 +
 +ただし、gaussの方が高速で動作します。normalvariateはスレッドセーフのようです。(検証はしていません。)
 +
 +一つだけ生成しても実際に正規分布になっているかどうか分からないので、100,000個の乱数を生成して小数第二位で四捨五入し、度数を数える以下のようなプログラムを作ってみました。
 +
 + import random
 +
 + dataCnt = {}
 + for i in range(100000):
 +     d = round(random.gauss(0,1),1)
 +     if d in dataCnt:
 +         dataCnt[d] += 1
 +     else:
 +         dataCnt[d] = 1
 +
 + sortedData = sorted(dataCnt.items())
 +
 + for k in sortedData:
 +     print("%.2f\t%d" % (k[0],k[1]))
 +
 +この結果を表計算ソフトに貼り付けてグラフを描くと次のようになりました。
 +
 +&ref(chart.png,mw:480,mh:360);
 +
 +乱数なので少しばらつきがありますが、ほぼ正規分布になっていることが分かります。
 +
 +Pythonにはこれ以外にも、対数分布、ガンマ分布やパレート分布、ワイブル分布などが標準で実装されています。
 +
 +詳しくは[[こちらのドキュメント:https://docs.python.org/ja/3/library/random.html]]で。
« Prev[4]  Next »[5]