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

问题描述:

我一直觉得random.randint(a, b)会返回一个范围为[a, b]的整数,而不是[a, b-1],比如range(...)Python:为什么`random.randint(a,b)`返回包含`b`的范围?

这有明显的不一致性吗?

+6

(不回答问题:)那么,你可以使用'randrange'。 – kennytm 2010-04-02 19:40:26

+0

也许我只是没有你那么聪明,但我不认为它是不一致的。我认为它只是为程序员提供了一种方法,用于调用一个包含随机数字而不需要使用运算符和幻数。更好的语言为他们的用户提供了创造性的途径。 – Musixauce3000 2016-04-29 13:45:26

+0

@ Musixauce3000这是不一致的,因为'range'和'randint'这两个方法都接受相同的逻辑值(即一个数字范围),但是这个值是以两种不同的 - 不一致的方式指定的(即包含一个的端点,另一个是排他性的)。 – 2016-04-29 20:20:44

我试图通过检查一些旧的来源来了解这一点。我怀疑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.12.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的文档字符串,这听起来像是原因可能是一个简单的错误。

+4

+1为了努力研究这一点,并提供了一些有趣的观察。 – 2010-04-02 21:22:08

+0

是的,这是一个很好的答案。非常感谢! – 2010-04-03 04:53:46

+0

也许randint规范来自另一种语言? – 2010-04-03 10:49:12

我不认为这是有原因的。但至少它有记录。

+1

+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的一般理念是可读性更高的语言,以这种方式实现它是有道理的。