如何生成符合高斯分布的两个值之间的随机数?

6

我很新手Python,在一本书中做了一些练习。我需要产生800个介于200到600之间,带有高斯分布的随机数。我已经做到了这一步:

x = pylab.zeros(800,float)
for x in range (0,800):
    y = random.gauss(550,30)

然而,只要这800个数都符合高斯分布,那么它们不会产生任何数量。我需要它们在200到600的范围内。


3
如果限制数值,它就不再是高斯分布了。 - Matthias
我该如何让它遵循这个形状,以便400成为最常出现的数字? - Versace
你可以检查 y 是否在 200 到 600 之间。虽然不是很简洁,但仍然很简单。 - Vincent Beltman
具有平均值为550和偏差为30的高斯分布非常不可能给您超过800的数字,但仍然有可能。您可以明确检查以过滤无效值。 - leeladam
2个回答

11

高斯分布并没有边界,但你可以使采样超出你的范围的概率变得很小。例如,你可以使用均值为400,标准偏差为200/3的数字样本,这意味着在范围[200, 600]之外的采样将在3个标准偏差之外。

mean = 400
stdev = 200/3   # 99.73% chance the sample will fall in your desired range

values = [random.gauss(mean, stdev) for _ in range(800)]

如果您想要一个有界的伪高斯分布,可以像这样做

values = []
while len(values) < 800:
    sample = random.gauss(mean, stdev)
    if sample >= 200 and sample < 600:
        values.append(sample)
所以,如果你抽样得到的数值超出了你所需的范围,就要将其丢弃并重新抽样。

这就是我想要做的。谢谢! - Versace

2
我认为最好的方法是生成高斯分布,然后重新调整所有值,使得max=600min=200

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接