42

正規分布から 0 と 1 の間だけに収まる値を選択できるようにしたいと考えています。場合によっては、基本的に完全にランダムな分布を返すだけにしたい場合もあれば、ガウスの形。

現時点では、次の機能を使用しています。

def blockedgauss(mu,sigma):
    while True:
        numb = random.gauss(mu,sigma)
        if (numb > 0 and numb < 1):
            break
    return numb

正規分布から値を選択し、0 から 1 の範囲外にある場合は破棄しますが、これを行うにはもっと良い方法があるはずだと感じています。

4

7 に答える 7

51

切り捨てられた正規分布が必要なようです。scipy.stats.truncnormscipy を使用すると、そのような分布から確率変量を生成するために使用できます。

import matplotlib.pyplot as plt
import scipy.stats as stats

lower, upper = 3.5, 6
mu, sigma = 5, 0.7
X = stats.truncnorm(
    (lower - mu) / sigma, (upper - mu) / sigma, loc=mu, scale=sigma)
N = stats.norm(loc=mu, scale=sigma)

fig, ax = plt.subplots(2, sharex=True)
ax[0].hist(X.rvs(10000), normed=True)
ax[1].hist(N.rvs(10000), normed=True)
plt.show()

ここに画像の説明を入力

上の図は切り捨てられた正規分布を示し、下の図は平均muと標準偏差が同じ正規分布を示していsigmaます。

于 2013-08-26T12:57:27.503 に答える
0

numpy.random.normal といくつかの追加コードを使用して、範囲内の値のリストを作成するための単純な関数を開発しました。

def truncnormal(meanv, sd, minv, maxv, n):
    finallist = []
    initiallist = []
    while len(finallist) < n:
        initiallist = list(np.random.normal(meanv, sd, n))
        initiallist.sort()
        indexmin = 0
        indexmax = 0
        for item in initiallist:
            if item < minv:
                indexmin = indexmin + 1
            else:
                break
        for item in initiallist[::-1]:
            if item > maxv:
                indexmax = indexmax + 1
            else:
                break
        indexmax = -indexmax
        finallist = finallist + initiallist[indexmin:indexmax]
    shuffle(finallist)
    finallist = finallist[:n] 
    print(len(finallist), min(finallist), max(finallist))

truncnormal(10, 3, 8, 11, 10000)
于 2022-02-24T03:25:54.863 に答える