我正在玩python中的random
模块,我发现这段代码总是返回inf
:
import random
print(random.uniform(0, float("inf")))
我想知道为什么以及是否有另一种方式这样做,以便它不总是返回inf
。
如果您调查random.uniform
来源,将会很清楚:
def uniform(self, a, b):
"Get a random number in the range [a, b) or [a, b] depending on rounding."
return a + (b-a) * self.random()
任何使用float('inf')
的算术都会返回-inf
或inf
。
在这种情况下:
b-a
,其中b
是inf
评估inf
,inf * self.random()
是inf
(或-inf
,如果self.random()
是负面)和a + inf
是inf
。
我不确定为什么你会想要一个未指定范围内的随机数,但也许出于实际目的使用像sys.maxsize
这样的上限可能已经足够了。
在无限范围内随机均匀地拾取值等同于从无限集中随机均匀地拾取元素。统一意味着所有元素都具有被选中的相同概率p
。如果p
为正,那么分布中概率的总和等于p*inf
,它是无穷大的,因此不等于1。
正如在接受的答案中所提到的,阅读代码解释了为什么这个特定的实现返回inf
但这不是一个bug,这是这个函数调用可以返回的唯一合乎逻辑的东西。但在我看来,这只会引发错误。
请注意,您可以将随机浮点生成(在任何时间间隔内)解释为等同于从无限集中拾取元素,但事实并非如此,因为我们没有使用无限精度浮点数(它们不是实数)。这就是调用random.uniform(0, 1)
定义得很好的原因。