如何生成与比例无关的随机浮点数?

时间:2013-07-06 20:15:54

标签: python random floating-point distribution

我想生成我选择称为“任意”正浮点数的东西;也就是说,随机数与尺度无关(换句话说,是对数均匀分布的数字)。我不是一个数学家,所以我知道我可能会有另一个名字。

这是我最初的,天真的解决方案:

import sys
import random

def arbitrary(min=sys.float_info.min_10_exp, max=sys.float_info.max_10_exp):
    return 10 ** random.uniform(min, max)

令我感到震惊的是,这可能并不理想:首先,我想象random.uniform()的有限精度与浮点表示本身之间可能存在一些相互作用,这会导致预期的聚束和间隙输出量更高。

有更好的方法吗? 仅生成一串随机位然后将其转换为它们所代表的浮点数会更有意义吗?

编辑:正如Oli Charlesworth在评论中指出的那样,“将随机位转换为浮动”的想法并没有达到我想要的效果(这是log(n)的均匀分布) )。

1 个答案:

答案 0 :(得分:1)

你的方法没有返回一些数字,这是正确的。例如,1.01.0000000000000002之间没有浮点数,但10**1.000000000000000210.00000000000000510.0和{{之间有两个数字1}}:10.00000000000000510.000000000000002。这两个数字永远不会被你的算法返回。

但是你可以作弊并使用10.000000000000004来更精确地取幂:

Decimal

因此,>>> float(10 ** Decimal('1')) 10.0 >>> float(10 ** Decimal('1.0000000000000001')) 10.000000000000002 >>> float(10 ** Decimal('1.00000000000000015')) 10.000000000000004 >>> float(10 ** Decimal('1.0000000000000002')) 10.000000000000005 需要生成足够精确的随机arbitrary指数,并将它们用作指数。假设64个二进制数字对于指数是足够的精度,代码将如下所示:

Decimal