生成均匀随机浮点数,可以返回所有可能的值

Ted*_*Ted 8 random floating-point go

在[0,1)中生成随机float64的一种简单方法是在[0,2⁵³]中生成一个均匀的随机int并将其除以2⁵³.这基本上就是rand.Float64()在做什么.但是,并非所有可能的float64值都在0和1之间生成:例如,如果该值低于2 - 4,则有效数字的最后4位总是为0.或者更简单地说,天真的方法总是返回2 - 3的倍数,而不是0到1之间的所有浮点数都是2 - 3的倍数.

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

对于上下文,我需要这个,因为我正在实现这篇论文并且假设"表示0和1之间的所有可能值"对于保持结果是必不可少的.

Ted*_*Ted 2

移植此代码(Severin 的答案中建议)是一个可能的选择。

我认为它相当于首先生成有效位数(通过在 [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(sig)/(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 float64(b)
}
Run Code Online (Sandbox Code Playgroud)

LeadingZeros*我们可以通过使用包中的一个函数bits而不是每位进行一次硬币翻转来使几何()更快。