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 这是不一致的,因为这两种方法 - range
和 randint
- 接受相同的逻辑值(即,一个数字范围),但该值是在两个不同的 - 不一致的 -方式(即,一种包含端点,另一种除外)。
为什么希望它不那么直观?
【参考方案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` 的范围?的主要内容,如果未能解决你的问题,请参考以下文章