【问题标题】:Python: why does `random.randint(a, b)` return a range inclusive of `b`?Python:为什么 `random.randint(a, b)` 返回一个包含 `b` 的范围?
【发布时间】:2011-02-03 20:33:21
【问题描述】:

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

这种明显的不一致有什么原因吗?

【问题讨论】:

  • (不回答问题:)好吧,你可以使用randrange
  • 也许我没有你那么精明,但我不认为这是一种矛盾。我认为它只是为程序员提供了一种调用包含随机数的方法,而无需使用运算符和幻数。更好的语言为他们的用户提供了他们可以发挥创造力的途径。
  • @Musixauce3000 这是不一致的,因为这两种方法 - rangerandint - 接受相同的逻辑值(即,一个数字范围),但该值是在两个不同的 - 不一致的 -方式(即,一种包含端点,另一种除外)。
  • 为什么希望它不那么直观?

标签: python random integer boundary


【解决方案1】:

我试图通过检查一些旧资料来了解这一点。我怀疑 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.randint2.02.12.22.3 中继续被弃用;但是random.randint2.1 中被标记为已弃用,尽管在2.2 中不再被标记为已弃用。

另外,random.py from version 2.1random.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 表示努力对此进行研究,并提出了一些有趣的观察结果。
  • 也许 randint 规范来自另一种语言?
【解决方案2】:

我猜random.randint 只是实现此功能的第一次尝试。看来 Python 开发者也觉得这是个问题,所以在 v1.5.2 中又增加了一个方法randrange,参数更标准:

random.randrange([start], stop[, step])

从范围(开始、停止、步骤)中返回一个随机选择的元素。这等价于choice(range(start, stop, step)),但实际上并不构建范围对象。

您可以使用randrange 代替randint 以避免令人惊讶。

另一方面,在许多情况下,问题被表述为“选择一个介于 1 和 6 之间的随机数”,使用randint(1, 6) 而不是写randrange(1, 7)randrange(min, max + 1) 可能更自然。

【讨论】:

    【解决方案3】:

    这是推测,但“给我一个从 a 到 b 的随机数”的正常人类用法包括在内。考虑到 Python 作为一种更易于阅读的语言的一般哲学,以这种方式实现它是有道理的。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • +1:原因并不重要。即使没有记录,也没关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 2014-03-29
      • 2021-10-06
      • 2010-12-08
      • 1970-01-01
      • 2014-09-25
      相关资源
      最近更新 更多