我总是觉得奇怪random.randint(a, b)
会返回[a, b]
范围内的整数,而不是像[a, b-1]
那样返回range(...)
。
这种明显的不一致是否有任何原因?
答案 0 :(得分:74)
我试图通过检查一些旧的来源来深究这一点。我怀疑 randint
是在Python的长整数之前实现的:这意味着如果你想要一个包含INT_MAX
的随机数,你需要调用random.randrange(0, INT_MAX + 1)
会溢出并导致(0, 0)
或(0, INT_MIN)
依赖的参数。
然而,在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
。{/ p>
random.randint
random.randint
继续在the Python 1.5.2 sources,2.0,2.1和2.2中弃用;但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.
"""
已将randint
标记为已弃用,但在2.3中不再标记为已弃用。
此外,2.1是第一个在randint
的文档字符串中注意到的内容:
{{1}}
唯一可用的旧版本是2.2,据我所知,此时{{1}}尚未实现。
因此,我得出结论,{{1}} 包括端点的推理在此时只知道Guido自己;鉴于Python 2.1中的docstring,听起来这可能是一个简单的错误。
答案 1 :(得分:10)
我猜random.randint
只是实现此功能的第一次尝试。似乎Python开发人员也认为这是一个问题,这就是为什么在v1.5.2中他们添加了另一个带有更多标准参数的方法randrange:
random.randrange([start], stop[, step])
从范围(开始,停止,步骤)返回随机选择的元素。这相当于选择(范围(开始,停止,步骤)),但实际上并不构建范围对象。
您可以使用randrange
代替randint
来避免令人惊讶的人。
另一方面,在许多情况下,问题的措辞是“选择1到6之间的随机数”,使用randint(1, 6)
代替编写randrange(1, 7)
或{{}可能更为自然1}}。
答案 2 :(得分:7)
这是推测,但正常的人类使用'给我一个从a到b的随机数'是包容性的。考虑到Python作为一种更易于阅读的语言的一般理念,以这种方式实现它是有道理的。
答案 3 :(得分:3)
我认为没有理由这样做。但至少它是有记录的。