我需要在截断正态分布的范围内生成一个值,例如,在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的截断规范的结果进行比较来检查上面的代码,并且它们确实产生了等效的图表。
- 1 回答
- 0 关注
- 116 浏览
添加回答
举报
0/150
提交
取消