为了账号安全,请及时绑定邮箱和手机立即绑定

如何在截断正态分布范围内生成随机数

如何在截断正态分布范围内生成随机数

Go
慕森王 2022-09-05 17:41:31
我需要在截断正态分布的范围内生成一个值,例如,在python中,您可以使用scipy.stats.truncnorm()来使def get_truncated_normal(mean=.0, sd=1., low=.0, upp=10.):    return truncnorm((low - mean) / sd, (upp - mean) / sd, loc=mean, scale=sd)这里如何描述是否有任何软件包可以制作一些东西,或者我应该自己编写以下函数?我尝试了以下方法,文档如何说,但它使数字不在所需的范围内:func GenerateTruncatedNormal(mean, sd uint64) float64 {    return rand.NormFloat64() * (float64)(sd + mean)}GenerateTruncatedNormal(10, 5)使16.61,-14.54,甚至32.8,但我预计由于->10 + 5 = 15是我们可以得到的最大值,因此获得15的几率很小。这是怎么回事?😅mean = 10
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

实现这一目标的一种方法是


从正态分布生成一个数字,其中包含所需的均值和标准差参数,x

如果它超出范围[低..high],然后把它扔掉再试一次。

这遵循了正态分布的概率密度函数,有效地切断了左右尾部。


func TruncatedNormal(mean, stdDev, low, high float64) float64 {

    if low >= high {

        panic("high must be greater than low")

    }


    for {

        x := rand.NormFloat64()*stdDev + mean

        if low <= x && x < high {

            return x

        }

        // fmt.Println("missed!", x)

    }

}



如果 [低..high]间隔非常窄,那么它将需要更多的计算时间,因为更多的生成的数字将被丢弃。但是,它在实践中仍然非常快速地收敛。


我通过绘制其结果并将其与scipy的截断规范的结果进行比较来检查上面的代码,并且它们确实产生了等效的图表。


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信