接近零的均匀实数分布

Uniform real distributions near zero

与(似乎更流行的)离散均匀分布相比,是否需要连续均匀分布的浮点近似值?

要生成量化为浮点类型的任意精度随机值,我期望的结果如下:

double rand0to1(void)
{
    int exp = -53;
    while (random_bit() == 0) exp--;
    return ldexp((double)((1L << 52) | random_52bits()), exp);
}

看起来很常见的是:

double rand0to1(void)            
{
    return ldexp((double)random_53bits(), -53);
}

显然,前者是无法实现的近似值,这对它来说是一个很大的黑点,但我想知道是否存在这样的情况:如果结果恰好是,尾数将始终完全随机化的保证是否会变得有用小.

如果我要实现我自己的通用统一实随机数生成器库,那么偏离惯例并保持尾数对于小值完全随机化会造成什么危害?

我最好的猜测是,在后续算术之后,额外的精度可能会强制舍入条件,这会使低位出现偏差。然而,我的直觉是这通常也会发生在离散分布的算术上。

我承认我可能不完全理解,但第二个例子似乎是你能得到的最随机的。 53 位的范围将从 000000000000001FFFFFFFFFFFFF,指数为 2^-53。假设 random_53bits 是统一的,这似乎为您提供了 [0,1) 范围内的所有可能值。我错过了什么吗?

如果您试图通过接近 0 的值获得更高的精度,您将面临的问题是您的分布不再均匀。每个指数值都有 2^52 个可能的值,因此您的分布看起来像 "spike",在 0 和 1*(2^-52) 之间有 2^52 个可能的值。我将使用 3 位来说明问题。

主要区别在于你的第一个定义——虽然不太正确,但很接近——在∩[0,1]上受支持,而你的第二个定义仅在∩({0}∪[上受支持2⁻⁵³, 1)).

您的第一个定义 return 为零的概率约为 2⁻¹⁰⁷⁵,这是四舍五入为零的实数的正确勒贝格测度。

相比之下,您的第二个定义省略了 (0, 2⁻⁵³) 中的所有浮点数,并且 returns 0 的概率为 2⁻⁵³。

为什么这很重要?

假设您想对结果取对数(例如,在指数或拉普拉斯采样器中),或计算任何其他具有零基本奇点的函数。

  • 您的第一个定义是安全的,没有拒绝抽样:2⁻¹⁰⁷⁵ 的概率非常小,甚至密码学家也认为它可以忽略不计。 除非您的随机位生成器严重损坏,否则保证您永远不会被零除或处理无穷大。

  • 但是,虽然您 不太可能 在使用第二个定义进行测试时被零除并产生 −∞,但概率为 2⁻⁵³是不可忽略的——比特币网络每秒多次遇到概率为 2⁻⁵³ 的事件,因为它永不满足地寻求燃烧能量以获得无用的随机数学难题解决方案。 要安全地使用第二个定义,您必须对输出进行拒绝采样以避免零,即使在 [0,1) 四舍五入到浮点数的真实均匀分布中零的概率可以忽略不计。

类似地,[0,1) 上的真均匀分布四舍五入为浮点数也可以得到 1。 通过从支持中省略 1,您排除了 [0,1) 的一小部分但不可忽略的部分,并且最多从 [0,1 − 2⁻⁵⁴) 而不是 [0,1].[=11 有效地采样=]

但无论如何都没有任何理由省略 1;例如,如果你打算使用 log1p() where ∼ [0,1) is uniform,你可以通过使用 log() where ∼ (0,1] 得到完全相同的分布,这使得使用更有效浮点数 space.

它不仅可以更有效地利用浮点数 space,而且可以使 broken and secure differential privacy 有所不同(尽管您可能还需要正确舍入的对数,而不仅仅是任何旧 libm).

(如果我想要 [0,] 上的 整数 采样器怎么办? 你已经有了一个统一的位采样器;鉴于此,你最好只对 ⌈lg ⌉ 位字符串进行拒绝采样,而不是通过浮点绕道而行。)

那么什么是正确的呢? 要编写一个 [0,1] 采样器(或 (0,1] 采样器,通过以概率 2⁻¹⁰⁷⁵ 调用 [0,1] 中的 0 事件不会发生错误),绘制具有几何分布的指数像你一样,然后在 比 53 位多 上绘制均匀分布的有效数字——并无条件地设置最低有效位。

最低有效位作为一种粘性位:在实数的真正均匀分布中,具有有限 53 位二进制扩展后跟所有 0 位的子集具有测量零,因此“几乎总是”一个 1 位,这个“粘性位”代表打破平局。 这为 [0,1].

中的每个浮点数赋予了正确的权重