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

Dav*_*ver 40 python random

我总是觉得很奇怪,它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.randint2.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的文档字符串,听起来这可能是一个简单的错误.

  • 通过一些有趣的观察,+1努力研究这个. (6认同)
  • 似乎大多数其他语言都将[]模型用于类似randint的函数... (2认同)

Mar*_*ers 11

我想random.randint这只是实现此功能的第一次尝试.似乎Python开发人员也认为这是一个问题,这就是为什么在v1.5.2中他们添加了另一种带有更多标准参数的randrange方法:

random.randrange([start], stop[, step])
Run Code Online (Sandbox Code Playgroud)

从范围(开始,停止,步骤)返回随机选择的元素.这相当于选择(范围(开始,停止,步骤)),但实际上并不构建范围对象.

您可以使用randrange而不是randint避免令人惊讶的人.

另一方面,在许多情况下,问题被称为"选择1到6之间的随机数",使用randint(1, 6)而不是书写randrange(1, 7)或更自然randrange(min, max + 1).


DNS*_*DNS 9

这是猜测,但正常的人类使用'给我一个从a到b的随机数'是包容性的.考虑到Python作为一种更易于阅读的语言的一般理念,以某种方式实现它是有道理的.