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

时间:2010-04-02 19:38:00

标签: python random

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

这种明显的不一致是否有任何原因?

4 个答案:

答案 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 sources2.02.12.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)

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