我希望能够从仅落在0到1之间的正态分布中选择值。在某些情况下,我希望能够基本上只返回完全随机的分布,而在其他情况下,我希望返回落在高斯的形状。

目前,我正在使用以下功能:

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

它从正态分布中选择一个值,如果该值不在0到1的范围内,则将其丢弃,但是我觉得必须有一种更好的方法。

最佳答案

听起来您想要truncated normal distribution
使用scipy,您可以使用scipy.stats.truncnorm从这样的分布生成随机变量:

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相同的正态分布。

关于python - 使用numpy.random.normal时如何指定上限和下限,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18441779/

10-12 18:34