9

Pythonでガウス関数を使用して、平均と分散を与える特定の範囲の間の数値を生成したい

だから私は0から10の間の範囲を持っているとしましょう

平均を3、分散を4にしたい

平均 = 3、分散 = 4

どうやってやるの ?

4

6 に答える 6

19

を使用しrandom.gaussます。ドキュメントから:

random.gauss(mu, sigma)
    Gaussian distribution. mu is the mean, and sigma is the standard deviation. This is slightly
    faster than the normalvariate() function defined below.

この結果をクランプできるように思えますが、それではガウス分布にはなりません。すべての制約を同時に満たすことはできないと思います。range に固定したい場合は[0, 10]、数値を取得できます。

num = min(10, max(0, random.gauss(3, 4)))

しかし、結果として得られる数値の分布は真のガウス分布にはなりません。この場合、ケーキを持って食べることもできないようです。

于 2013-05-09T21:54:24.470 に答える
6

おそらくこれを行うより良い方法がありますが、これは私がこの問題を解決するために最終的に作成した関数です:

import random

def trunc_gauss(mu, sigma, bottom, top):
    a = random.gauss(mu,sigma))
    while (bottom <= a <= top) == False:
        a = random.gauss(mu,sigma))
    return a

行ごとに分解すると、次のようになります。

import random

これにより、ガウス乱数ジェネレータ (random.gauss) を含むランダム ライブラリの関数を使用できます。

def trunc_gauss(mu, sigma, bottom, top):

関数の引数を使用すると、平均 (ミュー) と分散 (シグマ)、および目的の範囲の上限と下限を指定できます。

a = random.gauss(mu,sigma))

関数内で、ガウス分布に従って初期乱数を生成します。

while (bottom <= a <= top) == False:
a = random.gauss(mu,sigma))

次に、while ループは数値が指定された範囲内にあるかどうかをチェックし、現在の数値が範囲外である限り、新しい乱数を生成します。

return a

数値が範囲内に入るとすぐに while ループの実行が停止し、関数は数値を返します。

外れ値を切り上げたり切り下げたりして、範囲の上下の境界を人為的に膨らませていないため、これによりガウス分布のより良い近似が得られるはずです。

私はPythonを初めて使用するので、おそらくもっと簡単な方法がありますが、これでうまくいきました。

于 2014-11-14T00:06:43.707 に答える