random.randint和randrange有什么区别?
我知道的关于 randrange
和 randint
之间的区别就是,使用 randrange([start], stop[, step])
时,你可以传入一个 step
参数。而且 random.randrange(0, 1)
不会包括最后一个数字,而 randint(0, 1)
会把最后一个数字也算上。
所以,我不明白为什么 randrange(0, 1)
不会返回 0
或 1
。那我为什么要用 randrange(0, 2)
而不是 randrange(0, 1)
呢?
5 个回答
在Python中,范围(range)是指包含下限但不包含上限的一个区间。起初,这可能让人感到困惑,但这是有意为之,并且在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!
在数学中,这种情况被称为半开区间。Python选择使用半开区间是为了避免越界错误:
[为了避免越界错误] ... 在计算中,范围通常用半开区间来表示;从m到n(包括m)这个范围可以表示为从m(包括m)到n + 1(不包括n + 1)
因此,大多数Python库函数在可能的情况下都会使用这种半开范围的概念。
不过,randint这个函数不使用半开区间。
random.randint(4, 8)
# picks a random number from 4, 5, 6, 7, 8
# it does indeed include 8!
原因是历史原因:
- randint是在1998年左右的v1.5版本中早期添加的,这个函数最初用于生成随机的浮点数和随机的整数
- randrange是在Python的v1.5.2版本中添加的。在v2.0版本中,添加了一条通知,说明randint已经不推荐使用。
- 关于randint的不推荐使用的通知后来被移除了。
randint最初是一个早期的库函数,没有使用半开区间,因为当时这个概念在Python中并没有那么明确。
这是一个链接,指向Python的一个代码库,具体是关于随机数生成的部分。你可以在这个链接中找到相关的代码,了解它是如何工作的。
def randint(self, a, b):
"""Return random integer in range [a, b], including both end points.
"""
return self.randrange(a, b+1)
关于 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
是用来在你知道想要的随机数的最大值和最小值时使用的。