随机randint与randrange之间的区别

kil*_*own 36 python

我所知道的唯一区别randrange,并randint是, randrange([start], stop[, step])您可以使用步骤,并且random.randrange(0,1)不会考虑的最后一个项目,而randint(0,1)回报的选择包容性的最后一项.

所以,我找不到理由解释为什么randrange(0,1)不返回0或1,为什么存在randint(0, 1)randrange(0, 2)不是randrange(0, 1)谁返回0或1?

小智 41

对文档randrange说:

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

从中返回随机选择的元素range(start, stop, step).这相当于choice(range(start, stop, step)),但实际上并不构建范围对象.

而不是range(start, stop)回报.至于为什么......基于零的计数规则并且应该返回元素,我想.我猜想,获取随机索引最有用.[start, start+step, ..., stop-1][start, start+step, ..., stop]range(n)n

虽然randint记录为:

random.randint(a, b)

返回一个随机整数N这样a <= N <= b.别名randrange(a, b+1)

因此randint,当您拥有所需随机数的最大值和最小值时.


Vee*_*rac 26

https://github.com/python/cpython/blob/.../Lib/random.py#L218

    def randint(self, a, b):
        """Return random integer in range [a, b], including both end points.
        """

        return self.randrange(a, b+1)
Run Code Online (Sandbox Code Playgroud)


Jam*_*son 5

python 中的范围是包含下限但不包含上限的东西。乍一看,这可能看起来令人困惑,但这是故意的,并且在整个 python 中都使用它。

list(range(4, 10))
#     [4, 5, 6, 7, 8, 9]
#     does not include 10!

xs = ['a', 'b', 'c', 'd', 'e']  
xs[1:4]  
#     [xs[1], xs[2], xs[3]] 
#     does not include xs[4]!

bisect.bisect_left('jack', names, 2, 5)
#     perform a binary search on names[2], names[3], names[4]
#     does not include names[5]!

random.randrange(4, 8)
#     picks a random number from 4, 5, 6, 7
#     does not include 8!
Run Code Online (Sandbox Code Playgroud)

在数学中,这称为半开区间。Python 选择使用半间隔,因为它们可以避免差一错误

[避免差一错误] ...计算中的范围通常用半开区间表示;m至n(含)的范围由m(含)至n + 1(不含)的范围表示

因此,大多数 Python 库函数都会在可能的情况下使用这种半开范围的想法。

然而randint是一种使用半开区间的函数。

random.randint(4, 8)
#     picks a random number from 4, 5, 6, 7, 8
#     it does indeed include 8!
Run Code Online (Sandbox Code Playgroud)

原因是历史性的:

  • randint是在 1998 年左右的v1.5早期添加的,该函数名称用于随机生成随机浮点数和随机整数
  • randrange在 v1.5.2 中被添加到 python 中。在v2.0中,添加了一条通知,表示不推荐使用randint 。
  • randint 的弃用通知已被删除

randint 最初是一个早期的库函数,不包含半开区间,因为当时这个想法在 python 中还不太牢固。