首页 > 解决方案 > 生成可以返回所有可能值的均匀随机浮点数

问题描述

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

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

对于上下文,我需要这个,因为我正在实施这篇论文,并且假设“表示 0 和 1 之间的所有可能值”对于保持结果至关重要。

标签: gorandomfloating-point

解决方案


好吧,我相信标准方法是生成最多 1074 位的整数并将其映射到双精度。请注意,您的 RNG 应具有至少 1074 位长的内部状态。

参考实现:http: //xoshiro.di.unimi.it/random_real.c

关于它的讨论:http: //xoshiro.di.unimi.it/

另一个很好的链接:https ://lemire.me/blog/2017/02/28/how-many-floating-point-numbers-are-in-the-interval-01/


推荐阅读