我所知道的唯一区别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)
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 最初是一个早期的库函数,不包含半开区间,因为当时这个想法在 python 中还不太牢固。