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

标签 go random floating-point

在 [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/

相关文章:

go - 从指数和尾数创建 float

go - "No filesystem found for scheme gs"在谷歌云平台运行数据流时

http - 绕过 golang http 处理程序

c++ - 如何在 C++ 中避免 NaN

c++ - 浮点分辨率似乎比它应该的更受限制

python - Numpy:生成 2 个无重叠的 n 个随机数序列

go - 如何将结构 slice 作为指向函数的指针传递并修改它?

go - 关于 Go 中的接口(interface)

javascript - 使用特殊字符时随机字符串 HTML 转义问题

java - 无法为二维 boolean 数组赋值