Python:为啥 `random.randint(a, b)` 返回一个包含 `b` 的范围?

Posted

技术标签:

【中文标题】Python:为啥 `random.randint(a, b)` 返回一个包含 `b` 的范围?【英文标题】:Python: why does `random.randint(a, b)` return a range inclusive of `b`?Python:为什么 `random.randint(a, b)` 返回一个包含 `b` 的范围? 【发布时间】:2011-02-03 20:33:21 【问题描述】:

我一直觉得random.randint(a, b) 会返回一个在[a, b] 范围内的整数,而不是像range(...) 那样的[a, b-1]

这种明显的不一致有什么原因吗?

【问题讨论】:

(不回答问题:)好吧,你可以使用randrange 也许我没有你那么精明,但我不认为这是一种矛盾。我认为它只是为程序员提供了一种调用包含随机数的方法,而无需使用运算符和幻数。更好的语言为他们的用户提供了他们可以发挥创造力的途径。 @Musixauce3000 这是不一致的,因为这两种方法 - rangerandint - 接受相同的逻辑值(即,一个数字范围),但该值是在两个不同的 - 不一致的 -方式(即,一种包含端点,另一种除外)。 为什么希望它不那么直观? 【参考方案1】:

我试图通过检查一些旧资料来了解这一点。我怀疑 randint 是在 Python 的长整数之前实现的:这意味着如果你想要一个包含 INT_MAX 的随机数,你需要调用 random.randrange(0, INT_MAX + 1) ,这会溢出并导致(0, 0)(0, INT_MIN) 的参数取决于。

然而,即使回溯到the Python 1.5.2 sources,在Lib/whrandom.py 中我们也会看到:

#
# Get a random integer in the range [a, b] including both end points.
# (Deprecated; use randrange below.)
#
def randint(self, a, b):
    return self.randrange(a, b+1)

whrandom.randint 在2.0、2.1、2.2 和2.3 中继续被弃用;但是random.randint 在2.1 中被标记为已弃用,尽管在2.2 中不再被标记为已弃用。

另外,random.py from version 2.1 是random.randint 的文档字符串中第一个要注意的:

def randrange(self, start, stop=None, step=1, int=int, default=None):
    """Choose a random item from range(start, stop[, step]).

    This fixes the problem with randint() which includes the
    endpoint; in Python this is usually not what you want.
    Do not supply the 'int' and 'default' arguments.
    """

唯一比这更早的可用源是the 0.9.1 source,据我所知,randint 那时还没有实现。

因此,我得出结论,randint包括端点的推理目前只有 Guido 本人知道;鉴于 Python 2.1 的文档字符串,听起来原因可能是一个简单的错误。

【讨论】:

+1 表示努力对此进行研究,并提出了一些有趣的观察结果。 也许 randint 规范来自另一种语言?【参考方案2】:

我猜random.randint 只是实现此功能的第一次尝试。看来 Python 开发者也觉得这是个问题,所以在 v1.5.2 中又增加了一个方法randrange,参数更标准:

random.randrange([start], stop[, step])

从范围(开始、停止、步骤)中返回一个随机选择的元素。这等价于choice(range(start, stop, step)),但实际上并不构建范围对象。

您可以使用randrange 代替randint 以避免令人惊讶。

另一方面,在许多情况下,问题被表述为“选择一个介于 1 和 6 之间的随机数”,使用randint(1, 6) 而不是写randrange(1, 7)randrange(min, max + 1) 可能更自然。

【讨论】:

【参考方案3】:

这是推测,但“给我一个从 a 到 b 的随机数”的正常人类用法包括在内。考虑到 Python 作为一种更易于阅读的语言的一般哲学,以这种方式实现它是有道理的。

【讨论】:

【参考方案4】:

我认为没有理由这样做。但至少它是记录在案的。

【讨论】:

+1:原因并不重要。即使没有记录,也没关系。

以上是关于Python:为啥 `random.randint(a, b)` 返回一个包含 `b` 的范围?的主要内容,如果未能解决你的问题,请参考以下文章

python的rand是啥意思?

python第八课——random模块的使用

Python random模块

python模块汇总练习

Python学习笔记(随机数)

Python学习-------random模块(随机验证码)