4 回答
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,而不是每次拋一次硬幣。
TA貢獻1824條經驗 獲得超5個贊
因為 binary64 浮點數不是均勻分布的,所以無法生成可以返回小于 1 的所有可能值的均勻分布。
如果省略要求統一,則必須生成最小正非正規數2^(-1074)和零的所有可表示倍數。
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
}
}
}
如果性能至關重要,那么您可以構建一個僅包含有效數字的巨大查找表,并在表中選擇一個隨機位置。通過枚舉位域并僅存儲有效數字,可以以與上述類似的方式提前生成該表。
- 4 回答
- 0 關注
- 253 瀏覽
添加回答
舉報
