亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在截斷正態分布范圍內生成隨機數

如何在截斷正態分布范圍內生成隨機數

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 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號