使用python在范围内生成具有高斯函数的数字

Lil*_*ily 8 python gaussian

我想在python中使用高斯函数在特定范围之间生成一些数字,给出均值和方差

所以我说我的范围在0到10之间

我希望我的意思是3,方差是4

mean = 3,variance = 4

我怎样才能做到这一点 ?

Dan*_*ocq 16

使用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.
Run Code Online (Sandbox Code Playgroud)

在我看来,你可以钳制这个结果,但这不会使它成为高斯分布.我认为你不能同时满足所有的限制.如果你想把它夹在范围内[0, 10],你可以得到你的数字:

num = min(10, max(0, random.gauss(3, 4)))
Run Code Online (Sandbox Code Playgroud)

但随后产生的数字分布将不是真正的高斯分布.在这种情况下,似乎你不能吃蛋糕也吃它.

  • 但我所说的是高斯分布完全由均值和方差决定.因此,在0到10之间的附加约束将改变该分布.如果你想_clamp_结果到一个范围,你可以,但那时它不会是高斯分布. (5认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

如果我们逐行分解:

import random
Run Code Online (Sandbox Code Playgroud)

这允许我们使用随机库中的函数,其中包括高斯随机数生成器(random.gauss).

def trunc_gauss(mu, sigma, bottom, top):
Run Code Online (Sandbox Code Playgroud)

函数参数允许我们指定平均值(μ)和方差(sigma),以及我们所需范围的顶部和底部.

a = random.gauss(mu,sigma))
Run Code Online (Sandbox Code Playgroud)

在函数内部,我们根据高斯分布生成初始随机数.

while (bottom <= a <= top) == False:
a = random.gauss(mu,sigma))
Run Code Online (Sandbox Code Playgroud)

接下来,while循环检查数字是否在我们指定的范围内,并且只要当前数字超出我们的范围,就会生成一个新的随机数.

return a
Run Code Online (Sandbox Code Playgroud)

一旦数字在我们的范围内,while循环就会停止运行,函数会返回该数字.

这应该更好地逼近高斯分布,因为我们不会通过向上或向下舍入异常值来人为地夸大我们范围的顶部和底部边界.

我对Python很陌生,所以最有可能是更简单的方法,但这对我有用.