Python 中的小概率
Small probabilities in Python
Python 的 random() 函数有多准确?
假设我想根据 1 / 234276901
概率抛硬币做出决定,我还可以使用
if random() < 1. / 234276901:
声明?
这样的说法有多准确? (以if的实际概率为准)
是否有更精确(但 运行 在合理的时间内)的抛硬币方式?
如果你想得到 1 / 234276901 的硬币翻转,使用 random.random()
像这样:
>>> floor(random.random() * 234276901)
由于 random()
给出了 0 到 1 之间的实数值,我们应该将它乘以您的最大值以延长间隔而不是舍入值以将它们转换为整数。
你也可以使用random.randint()
:
>>> random.randint(1,234276901)
random.random()
产生一个 [0.0, 1.0) 范围内的浮点值(意味着 0.0
包含在可能的值中,但 1.0
不包含)。
浮点数有 53 位精度,因此在 0.0 和 1.0 之间得到 2 ** 53 个不同的 'steps'。 53 位足以表示 1 / 234276901
,它只需要大约 28 位:
>>> 234276901 .bit_length()
28
所以是的,使用 random.random() < 1 / 234276901
会起作用,还有很多精度。
Python 的 random() 函数有多准确?
假设我想根据 1 / 234276901
概率抛硬币做出决定,我还可以使用
if random() < 1. / 234276901:
声明?
这样的说法有多准确? (以if的实际概率为准)
是否有更精确(但 运行 在合理的时间内)的抛硬币方式?
如果你想得到 1 / 234276901 的硬币翻转,使用 random.random()
像这样:
>>> floor(random.random() * 234276901)
由于 random()
给出了 0 到 1 之间的实数值,我们应该将它乘以您的最大值以延长间隔而不是舍入值以将它们转换为整数。
你也可以使用random.randint()
:
>>> random.randint(1,234276901)
random.random()
产生一个 [0.0, 1.0) 范围内的浮点值(意味着 0.0
包含在可能的值中,但 1.0
不包含)。
浮点数有 53 位精度,因此在 0.0 和 1.0 之间得到 2 ** 53 个不同的 'steps'。 53 位足以表示 1 / 234276901
,它只需要大约 28 位:
>>> 234276901 .bit_length()
28
所以是的,使用 random.random() < 1 / 234276901
会起作用,还有很多精度。