当前位置: 首页 > 面试题库 >

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

纪正德
2023-03-14
问题内容

在我看来,总是random.randint(a, b)返回范围内的整数[a, b],而不是[a, b-1]like
,这总是很奇怪range(...)

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


问题答案:

我试图通过研究一些旧资料来弄清这个问题。我 怀疑
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)

whrandom.randint继续在被弃用2.0,2.1,2.2,以及2.3
;
random.randint在2.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.
    """

早于该版本的唯一可用源是0.9.1源,据我所知,randint当时尚未实现。

因此,我得出结论,此时,只有Guido本人才知道randint 包含 端点的理由。给定Python
2.1中的文档字符串,听起来原因可能是一个简单的错误。



 类似资料:
  • 我尝试了一些代码在Java中交换两个整数,而不使用第三个变量,即使用XOR。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?

  • 问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存

  • 我正在阅读SICP的树递归,其中是通过线性递归计算的。 我们还可以制定一个迭代过程来计算斐波那契数。其思想是使用一对整数a和b,初始化为Fib(1)=1和Fib(0)=0,并重复应用同时变换 不难证明,在应用该变换n次后,a和b将分别等于Fib(n1)和Fib(n)。因此,我们可以使用该过程迭代计算斐波那契数 (由Emacs Lisp重写,代替Scheme) “设置a b=a和b=a,我很难把我的

  • 问题内容: 这是我的第一个问题,我开始学习Python。之间有什么区别: 和 在下面的示例中编写时,它显示不同的结果。 和 问题答案: 在中,在将右侧的表达式赋给左侧之前对其求值。因此,它等效于: 在第二个示例中,运行时已更改的值。因此,结果是不同的。

  • 然而,今天我在处理一些代码时,意外地发现以下两个交换给出了不同的结果: 这让我难以置信。有人能给我解释一下这里发生了什么吗?

  • 然而,今天我在处理一些代码时,意外地发现以下两个交换给出了不同的结果: 这让我难以置信。有人能给我解释一下这里发生了什么吗?