从 random() 得到 0.0 的概率?

Probability of gettting 0.0 from random()?

我正在尝试制作一个简单的程序来演示一些东西,尽管我对它的数学有点困惑。

from random import random
a = random()

我阅读了随机函数,它的分布是 [0.0;1.0)。它使用 Mersenne Twister 生成伪随机数,它是一个 56 位精度的浮点数。

我假设这意味着它恰好生成 0.0 的概率是 1/2^56?

为了使概率为 1/2^28,a 必须低于多少?..我试着理解 56 位浮点数转换,但我似乎无法弄明白。实际浮点值必须是多少?

a = ?
if random() < a:
  print("Success")

在[0, 1)上连续均匀分布,样本小于x的部分为x。例如,½ 样本小于 ½。所以x使得一个样本小于x的概率是1/228是1/228.

对于 [0, 1] 上的量化分布(分布中只有某个量子的倍数),如果 x 是分布中的数字,则同样如此。如果它介于分布中的两个数字之间,则样本小于 x 的概率是刚好大于 x 的数字。但是,在您描述的情况下,似乎有 1/228 在分布中,这就是答案。

这取决于它是如何生成的。几乎所有的库都使用等距方法在 [0,1) 上产生值。简要地说:

  1. 生成统一整数(比如每次调用返回 64 位)
  2. 丢弃多余的位数以匹配浮点精度(单精度为 24,双精度为 53)
  3. 将整数转换为浮点数(自值 [=​​22=] 起不进行舍入)并缩放至范围 (2^-24/2^-53)

因此(取双打)该方法产生 2^53 个唯一的 FP 值,每个值出现的概率为 2^-53。底层整数生成器的位数对此没有影响。