是否可以在python中找到[a,b]范围内的随机浮点数?

时间:2011-03-09 17:29:01

标签: python random floating-point

我正在尝试在[0.8,0.9]的范围内生成python随机浮点数,但不幸的是,我发现的所有工具只能在[a,b]范围内为浮点数生成randoms。 (如Random.uniform(a,b)

与此同时,我尝试过这样的事情:

uniform(0.8,0.90000000001)

但那确实很糟糕

任何想法?

5 个答案:

答案 0 :(得分:7)

[0.8,0.9]和[0.8,0.9]之间的差异非常小。鉴于二进制浮点的局限性,我认为甚至没有区别,因为无论如何都不能精确地表示0.9。使用[0.8,0.9)。

答案 1 :(得分:3)

引用random.uniform() docstring:

  

获取[a,b]或[a,b]范围内的随机数,具体取决于舍入。

因此您甚至不知道是否包含端点。但你也不应该在意 - 在[0.8,0.9]范围内有900719925474100个浮点数。它将需要一生,直到它们中的任何一个发生,因此包含端点与否没有实际区别,即使端点可以完全表示为浮点数。

答案 2 :(得分:2)

准确生成端点值的概率应该可以忽略不计。如果您只使用Random.uniform(0.8,0.9),您会担心哪些不良后果? (当你说“0.8”和“0.9”实际上并不完全是8/10和9/10时,你是否还担心你得到的双精度漂浮?

您可能有非常不寻常的要求;但是,对于99.9%的申请,我认为答案是:只需使用Random.uniform(a,b)而不用担心。

答案 3 :(得分:1)

docsuniform(a, b)在[a,b] 1 中生成一个数字,但这似乎是文档错误,因为source显示它依赖于random(),根据文档,它返回[0.0,1.0] 2

如果你必须有[a,b],那么你可以尝试从整数生成这个范围:

random.inclusive_uniform = lambda a, b:
    random.randint(0, 0xFFFFFFFF) / float(0xFFFFFFFF) * (b - a) + a

我说“尝试”生成此范围,因为当无法精确表示边界时(在IEEE-754中无法精确表示0.8和0.9),那么范围实际上是[a',b'],其中a '和b'是a和b四舍五入的。请注意,这甚至可能大于范围[a,b],所以要小心!

1 具体来说,它表示返回值N仅限于a <= N <= b

2 然而,在源中的注释中,断言它实际上永远不会是0.0,所以我猜范围实际上是(0.0,1.0)。

答案 4 :(得分:1)

如果真的很重要,那么你可以这样做:

def uniform_closed(a, b):
     while True:
         r = random.uniform(a, b + (b - a) * 0.01)
         if r <= b: return r