我总是觉得很奇怪,它random.randint(a, b)会返回范围内的整数[a, b],而不是[a, b-1]像range(...).
有这种明显不一致的原因吗?
Mar*_*off 78
我试图通过检查一些旧的来源来深究这一点.我怀疑它randint是在Python的长整数之前实现的:意味着如果你想要一个包含的随机数INT_MAX,你需要调用random.randrange(0, INT_MAX + 1)哪些会溢出并导致参数(0, 0)或(0, INT_MIN)依赖.
但是,看起来甚至可以追溯到Python 1.5.2源代码,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)
Run Code Online (Sandbox Code Playgroud)
whrandom.randint继续在被弃用2.0,2.1,2.2,以及2.3 ; 但random.randint在2.1中被标记为已弃用,但在2.2中不再标记为已弃用.
此外,random.py从版本2.1开始,第一个在random.randintdocstring中注意到:
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.
"""
Run Code Online (Sandbox Code Playgroud)
唯一可用的旧源是0.9.1源,据我所知,此时randint没有实现.
因此,我得出结论,此时只有Guido自己知道randint 包含端点的原因; 鉴于Python 2.1的文档字符串,听起来这可能是一个简单的错误.
Mar*_*ers 11
我想random.randint这只是实现此功能的第一次尝试.似乎Python开发人员也认为这是一个问题,这就是为什么在v1.5.2中他们添加了另一种带有更多标准参数的randrange方法:
Run Code Online (Sandbox Code Playgroud)random.randrange([start], stop[, step])从范围(开始,停止,步骤)返回随机选择的元素.这相当于选择(范围(开始,停止,步骤)),但实际上并不构建范围对象.
您可以使用randrange而不是randint避免令人惊讶的人.
另一方面,在许多情况下,问题被称为"选择1到6之间的随机数",使用randint(1, 6)而不是书写randrange(1, 7)或更自然randrange(min, max + 1).