Python:为什么`random.randint(a,b)`返回包含`b`的范围?
我一直觉得random.randint(a, b)
会返回一个范围为[a, b]
的整数,而不是[a, b-1]
,比如range(...)
。Python:为什么`random.randint(a,b)`返回包含`b`的范围?
这有明显的不一致性吗?
我试图通过检查一些旧的来源来了解这一点。我怀疑这是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为了努力研究这一点,并提供了一些有趣的观察。 – 2010-04-02 21:22:08
是的,这是一个很好的答案。非常感谢! – 2010-04-03 04:53:46
也许randint规范来自另一种语言? – 2010-04-03 10:49:12
我不认为这是有原因的。但至少它有记录。
+1:原因并不重要。即使它没有记录,它仍然没有关系。 – 2010-04-03 02:48:53
我猜random.randint
只是实现此功能的第一次尝试。看来,Python开发也认为,这是一个问题,这就是为什么在V1.5.2它们加入的另一种方法randrange与多个标准参数:
random.randrange([start], stop[, step])
返回从范围内的随机选择的元件(启动,停止,一步)。这相当于选择(范围(开始,停止,步骤)),但实际上并不构建范围对象。
您可以使用randrange
而不是randint
来避免令人惊讶的人。另一方面,在许多情况下,问题的表述为'选择1和6之间的随机数',使用randint(1, 6)
而不是编写randrange(1, 7)
或randrange(min, max + 1)
可能更自然。
这是猜测,但'给我一个随机数从a到b'的正常人类使用是包容性的。鉴于Python的一般理念是可读性更高的语言,以这种方式实现它是有道理的。
(不回答问题:)那么,你可以使用'randrange'。 – kennytm 2010-04-02 19:40:26
也许我只是没有你那么聪明,但我不认为它是不一致的。我认为它只是为程序员提供了一种方法,用于调用一个包含随机数字而不需要使用运算符和幻数。更好的语言为他们的用户提供了创造性的途径。 – Musixauce3000 2016-04-29 13:45:26
@ Musixauce3000这是不一致的,因为'range'和'randint'这两个方法都接受相同的逻辑值(即一个数字范围),但是这个值是以两种不同的 - 不一致的方式指定的(即包含一个的端点,另一个是排他性的)。 – 2016-04-29 20:20:44