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

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

生成可以返回所有可能值的均勻隨機浮點數

生成可以返回所有可能值的均勻隨機浮點數

Go
慕沐林林 2023-05-08 15:57:06
在 [0,1) 中生成隨機 float64 的一種簡單方法是在 [0,2?3) 中生成一個均勻隨機的 int 并將其除以 2?3。這基本上就是rand.Float64()正在做的事情。然而,并非所有介于 0 和 1 之間的 float64 值都可以通過這種方式生成:例如,如果該值小于 2??,則有效數的最后 4 位始終為 0?;蛘?,更簡單地說, naive 方法總是返回 2??3 的倍數,并非所有介于 0 和 1 之間的浮點數都是 2??3 的倍數。您如何生成一個統一隨機的 float64,例如每個可能的值都有機會被返回?(在這里,均勻隨機意味著在實數區間[0,1] 內):從概念上講,我想選擇一個介于 0 和 1 之間的均勻隨機實數并返回最接近的浮點數。)對于上下文,我需要這個,因為我正在實施這篇論文,并且假設“表示 0 和 1 之間的所有可能值”對于結果保持是必不可少的。
查看完整描述

4 回答

?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

我認為這相當于首先生成有效位(通過在 [1,2) 中生成隨機浮點數),然后從幾何分布中選擇指數(它有 0.5 的機會是 -1,0.25 的機會是 - 2 等)。

// uniform returns a uniformly random float in [0,1).

func uniform() float64 {

? sig := rand.Uint64() % (1 << 52)

? return (1 + float64(i)/(1<<52)) / math.Pow(2, geometric())

}


// geometric returns a number picked from a geometric

// distribution of parameter 0.5.

func geometric() float64 {

? b := 1

? for rand.Uint64()%2 == 0 {

? ? ?b++

? }

? return b

}

我們可能可以通過使用包中的一個LeadingZeros*函數來加快 geometric() 的速度bits,而不是每次拋一次硬幣。


查看完整回答
反對 回復 2023-05-08
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

好吧,我相信標準方法是生成最多 1074 位整數并將其映射到雙精度數。請注意,您的 RNG 應具有至少 1074 位長的內部狀態。

查看完整回答
反對 回復 2023-05-08
?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

因為 binary64 浮點數不是均勻分布的,所以無法生成可以返回小于 1 的所有可能值的均勻分布。

如果省略要求統一,則必須生成最小正非正規數2^(-1074)和零的所有可表示倍數。


查看完整回答
反對 回復 2023-05-08
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

您可以通過生成 16 個隨機字節并僅在它是[0,1). 這種方法應該為您提供該范圍內所有值的均勻分布,并且性能不會比基于簡單基準測試的其他策略差很多。

例如(去游樂場):

import "math/rand"


func randFloat64() float64 {

  for {

    f := math.Float64frombits(rand.Uint64())

    if f >= 0 && f < 1.0 {

      return f

    }

  }

}

如果性能至關重要,那么您可以構建一個僅包含有效數字的巨大查找表,并在表中選擇一個隨機位置。通過枚舉位域并僅存儲有效數字,可以以與上述類似的方式提前生成該表。


查看完整回答
反對 回復 2023-05-08
  • 4 回答
  • 0 關注
  • 253 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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