我正在尝试在[0.8,0.9]的范围内生成python随机浮点数,但不幸的是,我发现的所有工具只能在[a,b]范围内为浮点数生成randoms。 (如Random.uniform(a,b)
)
与此同时,我尝试过这样的事情:
uniform(0.8,0.90000000001)
但那确实很糟糕
任何想法?
答案 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)
docs说uniform(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