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

在python中可以找到[a,b]范围内的随机浮点吗?,python,random,floating-point,Python,Random,Floating Point,我试图在python中生成[0.8,0.9]范围内的随机浮点,但不幸的是,我找到的所有工具都只能为浮点生成[a,b]范围内的随机数。(如random.uniform(a,b)) 与此同时,我试着做这样的事情: uniform(0.8,0.90000000001) 但那真的很糟糕 有什么想法吗?在[0.8,0.9]和[0.8,0.9]之间的差别是非常小的。考虑到二进制浮点的局限性,我认为甚至没有差别,因为0.9无论如何都不能精确表示。使用[0.8,0.9)。精确生成端点值的概率应该可以忽略不计。

我试图在python中生成[0.8,0.9]范围内的随机浮点,但不幸的是,我找到的所有工具都只能为浮点生成[a,b]范围内的随机数。(如
random.uniform(a,b)

与此同时,我试着做这样的事情:

uniform(0.8,0.90000000001)
但那真的很糟糕


有什么想法吗?

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

精确生成端点值的概率应该可以忽略不计。如果您只使用
随机、均匀(0.8,0.9)
,您会担心什么不良后果?(您是否也担心当您说“
0.8
”和“
0.9
”时会出现双精度浮动事实上,不正是8/10和9/10吗?)


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

引用
Random.uniform()
docstring:

根据舍入情况,获取[a,b]或[a,b]范围内的随机数

因此,您甚至不知道端点是否包含在内,但您也不必在意——在[0.8,0.9]范围内有900719925474100个浮点数因此,即使端点可以精确地表示为一个浮点数,也没有实际的区别,即使端点可以精确地表示为一个浮点数。

假设
uniform(a,b)
在[a,b]中生成一个数字1,但这似乎是一个文档错误,因为显示它依赖于
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,如果它真的很重要,那么您可以这样做:

def uniform_closed(a, b):
     while True:
         r = random.uniform(a, b + (b - a) * 0.01)
         if r <= b: return r
def uniform_关闭(a、b):
尽管如此:
r=随机均匀(a,b+(b-a)*0.01)

如果r McCaugehan-事实上我不知道。我正在尝试模拟一些事情,这是可能发生的概率范围。我在想为什么我找不到任何工具来证明在任何给定范围内均匀随机数远远少于可能的随机数,因为浮点数是确定的关于非均匀。@Glenn:[0.8,0.9]范围恰好是一致的,因为IEEE二进制表示法中两个数字的指数是相同的。这是不同的,因为浮点的限制也适用于
uniform
的上限。也就是说,当你说
uniform(0.8,0.9)时
,实际上你说的是更接近于统一标准(0.800000000000004,0.90000000000000002)
。[a,b]和[a,b]之间的差异这里是最大值之间的差异(大约)0.89999999999991和0.9000000000000002。这不太可能发生,但区别是存在的。答案和注释都是很好的观点。我以前从未考虑过对浮点值应用均匀分布,只是因为在自然界中,在任何两个数之间都有无限多的数,每个数都是无穷小的理论上可能。我想给定fp数的精度限制,你可以这样做。使用80000000000000到900000000000001之间的均匀分布,你将得到你想要的分布,而不存在f-p算法的陷阱。文件说它可能是[a,b]或[b][a,b]。在docstring中比在不必要的冗长HTML文档中更清晰——出于某种原因,它不使用范围符号——但它在那里(“端点值b可能包括也可能不包括……”)。@Glenn Maynard:源代码既不显示[a,b]也不显示[a,b][a,b)是真的。如果你仔细阅读源代码,你会发现x,y和z永远不会为零,这意味着N永远不会比b或a的大约
0.0099%*(b-a)
更接近。对于OP来说,这可能很重要,因为这意味着
random.uniform(0.8,0.9)
将在这个范围内[0.8000009901104553,0.8999900988954448]。也许,虽然处于一个稍微小的范围通常比超出范围更安全。例如,如果您正在执行类似于
1/(1-n)
的操作,则预期n=[0,1),那么n=1将导致除法为零。@Glenn Maynard:是的。OP的案例似乎不容易受到这个特定问题的影响,但毫无疑问,超出范围可能是一个问题,我对此提出了警告。另一方面,我可能把它夸大了。它可能超出了[0.8,0.9]的范围(取决于平台的解析方法),但不会超出[a,b]的范围。也就是说,当将0.8和0.9解析为
a
b
时,会发生精度损失和舍入到二进制分数。在
随机中不应再发生错误。inclusive\u uniform()
。任何真正需要清晰、可预测、统一结果的人都应该使用定点数学。