5

我正在寻找一种在开-开区间 (0,1) 上生成随机浮点数的有效方法。我目前有一个 RNG,它在 [0, (2^32)-1] 的闭闭区间上生成随机整数。我已经在区间 [0,1) 上创建了一个半开浮点 RNG,只需将整数 RNG 的结果乘以 1/((2^32)-1) 而不是除以 (2^32) -1,因为它效率低下。

我目前在区间 (0,1) 上生成数字的方式是使用如下条件语句:

float open_open_flt = (closed_open_flt==0) ? closed_open_flt : FLT_MIN; 

不幸的是,这是相当低效的,因为它是控制代码,我觉得它引入了一些偏见。

有人可以提出替代方案吗?

4

4 回答 4

4

由于实际观察到 0 概率的概率非常小,并且检查一个数是否等于 0 成本最低(与加法或乘法相比),我会反复重新生成随机数,直到它不等于 0。

于 2013-07-30T18:59:29.077 回答
4

你已经在那里了。

当前生成器产生的两个浮点数之间的最小距离是 1/(2^32)。

因此,您的生成器正在有效地产生[0,1-1/(2^32)]

1/(2^32) 大于 FLT_MIN。

因此,如果您将 FLT_MIN 添加到您的生成器中,

float open_open_flt = FLT_MIN + closed_open_flt;

你会得到[FLT_MIN,1-(1/(2^32))+FLT_MIN],它用作(0,1)生成器。

于 2013-07-30T19:15:09.697 回答
2

给定从 [0, 2 32x ) 中随机选择的样本,我建议使用:

0x1.fffffep-32 * x + 0x1p-25

推理:

  • 这些值使得在四舍五入之前最高x产生略小于 1-2 -25,因此它被四舍五入到float小于 1 的最大值,即 1-2 -24。如果我们让它更大,一些值会四舍五入到 1,这是我们不想要的。如果我们让它更小,更少的值会四舍五入到 1-2 -24,所以它的表现会比我们想要的要少(下面会详细介绍)。
  • 这些值使得最低值x产生 2 -25。这产生了一些对称性:如上所述,分布在舍入之前被迫停在高边 1-2 -25,所以我们让它在底部对称,停在 0+2 -25。在某种程度上,就好像我们将实数线分箱在宽度为 2 -24的箱中,然后删除以 0 和 1 为中心的箱(它们将 2 -25扩展到这些数字的任一侧)。
  • 我们保留的每个 bin 都包含大约相同数量的样本值。但是,不同float的值会出现在 bin 中,因为分辨率会float有所不同。它在 0 附近更精细,在 1 附近更粗糙。通过这种安排,每个 bin 的表示大致一致,但较低的 bin 将有更多的样本,每个样本的概率较低。整体分布保持均匀。
  • 我们可以扩展低端,使其更接近于零。但是,对于 (0, ½) 中的大多数d,(0, d ) 中的样本将多于 (1- d , 1) 中的样本,因此分布将是不对称的。

如您所见,浮点格式会导致从 0 到 1 的分布出现一些不规则性。据我所知,这个问题已在其他 Stack Overflow 问题中提出,但从未彻底讨论过。如上所述留下这些违规行为是否符合您的目的取决于您的应用程序。

潜在变化:

  • 量化所有样本,使它们以规则间隔出现, 2 -24,而不是在float格式更精细的地方更精细。
  • 允许值在舍入前接近 1,但在舍入后将其转换为 1-2 -24,并降低底部端点以匹配。这以增加聚集成 1-2 -24的值的数量为代价减少了大约 0 和大约 1 的排除段,因为分辨率不足以进行更多区分。
  • 切换到double。然后有一个从原始x值到浮点值的 1-1 映射,您可以根据需要尽可能接近 0 和 1。

此外,与ElKamina 的回答相反,浮点比较(甚至为零)通常并不比加法快。比较需要对结果进行分支,这是许多现代 CPU 中的一个问题。

于 2013-07-30T20:48:29.390 回答
1

我正在寻找一种在开-开区间 (0,1) 上生成随机浮点数的有效方法。我目前有一个 RNG,它在 [0, (2^32)-1] 的闭闭区间上生成随机整数。我已经在区间 [0,1) 上创建了一个半开浮点 RNG,只需将整数 RNG 的结果乘以 1/((2^32)-1)

这意味着您的生成器“尝试”生成 2^32 个不同的值。问题是,浮点类型的长度为 4 个字节,因此总体上具有少于 2^32 个不同的定义值。准确地说,区间 [1/2, 1) 上只能有 2^23 个值。根据您的需要,它可能是一个问题或不是。

您可能希望在迭代 中使用滞后的斐波那契生成器 ( wiki来自俄罗斯维基的迭代公式
) 这已经从 [0,1) 生成数字,因为初始值属于该区间并且可能足以满足您的目的。

于 2013-07-31T07:29:58.940 回答