【问题标题】:Why does random.uniform(0, float("inf")) always return inf?为什么 random.uniform(0, float("inf")) 总是返回 inf?
【发布时间】:2019-03-09 10:30:39
【问题描述】:

我在 python 中使用random 模块,我发现这段代码总是返回inf

import random

print(random.uniform(0, float("inf")))

我想知道为什么以及是否有其他方法可以做到这一点,这样它就不会总是返回inf

【问题讨论】:

    标签: python python-3.x random


    【解决方案1】:

    如果您调查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') 的算术都会返回-infinf

    在这种情况下:

    b-a 其中binf 计算结果为infinf * self.random()inf(或-inf,如果self.random() 是负数)并且a + inf 是@9876543333 p>

    【讨论】:

      【解决方案2】:

      我不太确定您为什么想要一个未指定范围内的随机数,但出于实际目的,使用 sys.maxsize 之类的东西作为上限可能就足够了。

      【讨论】:

        【解决方案3】:

        在无限范围内均匀随机选取一个值,相当于从一个无限集合中均匀随机选取一个元素。统一意味着您的所有元素都有相同的概率p 被选中。如果p 为正数,则分布中的概率之和等于p*inf,它是无限的,因此不等于1。

        正如在接受的答案中提到的,阅读代码解释了为什么这个特定的实现返回 inf 但这不是一个错误,这是这个函数调用可以返回的唯一合乎逻辑的事情。但在我看来,这应该只是引发一个错误。

        请注意,您可能会将随机浮点数生成(在任何时间间隔内)解释为等同于从无限集合中选择一个元素,但事实并非如此,因为我们没有使用无限精度浮点数(它们不是实数)。这就是对 random.uniform(0, 1) 的调用定义明确的原因。

        【讨论】: