是否有任何关于连续均匀分布的浮点近似与(看似更受欢迎的)离散均匀分布形成对比的呼吁?
为了产生一个量化为浮点类型的任意精度随机值,我希望有以下几点:
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);
}
显然,前者是一个无法实现的近似值,它是一个很大的黑色标记,但我想知道是否有一些情况,如果结果恰好很小,那么尾数将始终完全随机化的保证会变得有用。
如果我正在实现我自己的通用统一实数随机数生成器库,那么偏离惯例并保持尾数完全随机化为小值会对我造成什么伤害呢?
我最好的猜测是,在后续算术之后,额外的精度可能会强制舍入条件,这会使低阶位偏置。但是,我的直觉是,这通常也会发生在离散分布的算术上。
答案 0 :(得分:1)
主要区别在于,您的第一个定义(虽然不太正确,但很接近)支持 ? ∩ [0,1),而您的第二个定义仅支持 ? ∩ ({0} ∪ [ 2⁻⁵³, 1)).
您的第一个定义将以大约 2⁻¹⁰⁷⁵ 的概率返回零,这是四舍五入为零的实数的正确勒贝格度量。
相比之下,您的第二个定义省略 (0, 2⁻⁵³) 中的所有浮点数,并以 2⁻⁵³ 的概率返回 0。
为什么这很重要?
假设您想对结果取对数(例如,在指数采样器或拉普拉斯采样器中),或计算具有零本质奇点的任何其他函数。
这对于您的第一个定义来说是安全的,没有拒绝抽样:2⁻¹⁰⁷⁵ 的概率非常小,以至于密码学家也认为它可以忽略不计。 除非您的随机位生成器严重损坏,否则您永远不会被零除或处理无穷大。
但是,虽然您在使用第二个定义进行测试时不太可能被零除并产生 −∞,但 2⁻⁵³ 的概率不可忽略——比特币网络在一秒钟内以 2⁻⁵³ 的概率在一个事件上绊倒很多次,它为无用的随机数学难题解决方案燃烧能量的永不满足的追求。 要安全地使用第二个定义,您必须对输出进行拒绝采样以避免为零,即使在 [0,1) 上舍入为浮点数的真正均匀分布中为零的概率是不可忽略的。
同样,[0,1) 上的真正均匀分布四舍五入为浮点数也可以产生 1。 通过从支持中省略 1,您可以排除 [0,1) 的一小部分但不可忽略的部分,并且最多有效地从 [0,1 − 2⁻⁵⁴) 而不是 [0,1) 进行采样。
但无论如何都很少有理由省略 1;例如,如果您打算使用 log1p(?) 其中 ? ∼ [0,1) 是均匀的,您可以通过处理 log(?) where ? ∼ (0,1) 来获得完全相同的分布,这使得更有效地利用浮点空间。
它不仅可以更有效地利用浮点空间,而且可能会在 broken and secure differential privacy 之间产生差异(尽管您可能还需要一个正确舍入的对数,而不仅仅是任何旧的 libm)。>
(如果我想要在 [0,? 上的 integer 采样器怎么办),你问? 你已经有了一个统一的位采样器;鉴于此,您最好只对 ⌈lg ?⌉ 位字符串进行拒绝采样,而不是通过浮点绕道而行。)
那么什么是正确的呢? 要编写 [0,1] 采样器(或 (0,1] 采样器,通过以概率 2⁻¹⁰⁷⁵ 调用 [0,1] 中的 0 事件是一个不会发生的错误),请绘制具有几何分布的指数像您一样,然后在 多于 53 位上绘制均匀分布的有效数,并无条件地设置最低有效位。
最低有效位用作一种粘滞位:在实数的真正均匀分布中,具有有限 53 位二进制扩展后跟所有 0 位的子集的度量为零,因此“几乎总是”一个 1 位,这个“粘性位”代表打破平局。 这为 [0,1] 中的每个浮点数提供了正确的权重。
答案 1 :(得分:0)
我承认我可能不完全明白,但第二个例子似乎是随机的。 53位的范围将从00000000000000
到1FFFFFFFFFFFFF
,其指数为2^-53
。假设random_53bits
是统一的,这似乎可以为您提供[0,1)
范围内的所有可能值。我错过了什么吗?
如果您试图从接近0的值获得更高的精度,那么您面临的问题是您的分布不再一致。对于每个指数值,您将拥有2 ^ 52个可能的值,因此您的分配看起来像&#34; spike&#34;具有2 ^ 52个可能的值,介于0和1 *(2 ^ -52)之间。我将使用3位插图来解释问题。