random.randint和randrange有什么区别?

77 投票
5 回答
149524 浏览
提问于 2025-04-16 03:08

我知道的关于 randrangerandint 之间的区别就是,使用 randrange([start], stop[, step]) 时,你可以传入一个 step 参数。而且 random.randrange(0, 1) 不会包括最后一个数字,而 randint(0, 1) 会把最后一个数字也算上。

所以,我不明白为什么 randrange(0, 1) 不会返回 01。那我为什么要用 randrange(0, 2) 而不是 randrange(0, 1) 呢?

5 个回答

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中并没有那么明确。

60

这是一个链接,指向Python的一个代码库,具体是关于随机数生成的部分。你可以在这个链接中找到相关的代码,了解它是如何工作的。

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

        return self.randrange(a, b+1)
73

关于 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 是用来在你知道想要的随机数的最大值和最小值时使用的。

撰写回答