Python 如何在高斯分布的两个值之间生成随机数

Python 如何在高斯分布的两个值之间生成随机数,python,gaussian,Python,Gaussian,对Python非常陌生,在书中做一些练习。我需要生成800个介于200和600之间的随机数,具有高斯分布。我已经做到了这一点: x = pylab.zeros(800,float) for x in range (0,800): y = random.gauss(550,30) 然而,只要所有的800都符合高斯分布,这难道不会产生任何数字吗?我需要它们在200到600的范围内。高斯分布是没有界的,但是你可以使你不太可能在你的范围外采样。例如,您可以对平均值为400、标准偏差为200/3

对Python非常陌生,在书中做一些练习。我需要生成800个介于200和600之间的随机数,具有高斯分布。我已经做到了这一点:

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

然而,只要所有的800都符合高斯分布,这难道不会产生任何数字吗?我需要它们在200到600的范围内。

高斯分布是没有界的,但是你可以使你不太可能在你的范围外采样。例如,您可以对平均值为400、标准偏差为200/3的数字进行采样,这意味着超出范围[200600]将超出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)
值=[]
而len(值)<800:
样本=随机高斯(平均值,标准差)
如果样本>=200且样本<600:
values.append(示例)

因此,如果采样的值超出所需范围,你扔掉它,然后重新采样。

我认为最好的方法是生成一个高斯分布,然后重新缩放所有值,以便
max=600
min=200
如果你限制这些值,它就不再是高斯分布了。那么我如何让它遵循这个形状呢,所以400是出现最多的数字?你可以检查y是否在200到600之间。不是很干净,但仍然是简单的高斯分布,平均值为550,偏差为30,不太可能给出超过800的数字,但这仍然是可能的。您可以显式地检查以过滤无效值。这就是我试图做的。谢谢