gpt4 book ai didi

go - 生成可以返回所有可能值的均匀随机 float

转载 作者:IT王子 更新时间:2023-10-29 01:09:05 24 4
gpt4 key购买 nike

在 [0,1) 中生成随机 float64 的一种简单方法是在 [0,2⁵³) 中生成一个均匀随机的 int 并将其除以 2⁵³。这本质上就是rand.Float64()是在做。然而,并非所有介于 0 和 1 之间的 float64 值都可以通过这种方式生成:例如,如果该值小于 2⁻⁴,则有效数的最后 4 位始终为 0。或者,更简单地说, naive 方法总是返回 2⁻⁵³ 的倍数,并非所有介于 0 和 1 之间的 float 都是 2⁻⁵³ 的倍数。

如何生成一个均匀随机的 float64,例如每个可能的值都有机会被返回? (在这里,均匀随机意味着在 实数区间 [0,1] 内):从概念上讲,我想选择一个介于 0 和 1 之间的均匀随机实数并返回最接近的 float 。)

对于上下文,我需要这个因为我正在实现 this paper并且假设“表示 0 和 1 之间的所有可能值”对于结果成立是必不可少的。

最佳答案

移植 this code (在 Severin 的回答中建议)是一个可能的选择。

我认为这相当于先生成有效位(通过在 [1,2) 中生成随机 float ),然后从几何分布中选择指数(它有 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
}

我们可能可以通过使用 bits 中的 LeadingZeros* 函数之一使 geometric() 更快封装而不是每位抛一枚硬币。

关于go - 生成可以返回所有可能值的均匀随机 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53277105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com