随机randint与randrange之间的区别

时间:2010-08-22 06:18:28

标签: python

randrangerandint之间唯一的区别就在于此 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?

5 个答案:

答案 0 :(得分:41)

docs on 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 is documented as

  

random.randint(a, b)

     

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

所以randint适用于您拥有所需随机数的最大值和最小值。

答案 1 :(得分:22)

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)

答案 2 :(得分:3)

两者之间的区别在于randint只有在您知道两个间隔限制时才能使用。 如果您只知道间隔randint的第一个限制将返回错误。在这种情况下,您只能使用randrange一个间隔,它将起作用。 尝试运行以下代码以使用随机三角形填充屏幕:

import random
from tkinter import *

tk = Tk()
canvas = Canvas(tk, width=400, height=400)
canvas.pack()

def random_triangle(l1,l2,l3,l4,l5,l6):
  x1 = random.randrange(l1)
  y1 = random.randrange(l2)
  x2 = x1 + random.randrange(l3)
  y2 = y1 + random.randrange(l4)
  x3 = x2 + random.randrange(l5)
  y3 = y2 + random.randrange(l6)
  canvas.create_polygon(x1,y1,x2,y2,x3,y3)

for x in range(0, 100):
  random_triangle(300,400,200,500,400,100)

尝试使用randint功能再次运行上述代码。你会看到你会收到一条错误信息。

答案 3 :(得分:0)

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!

在数学中,这称为half-open interval。 Python选择使用半间隔是因为它们避免了off-by-one errors

  

[避免出现一次性错误] ...计算中的范围通常用半开间隔表示; 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!

原因是历史性的:

  • randint 是在v1.5的1998年初添加的,此函数名称用于随机生成随机浮点数和integers随机生成
  • randrange 在v1.5.2中的python中添加了。在v2.0中,添加了一条通知,指出randint已被弃用。
  • 关于randint的弃用通知已被删除

randint最初是一个较早的不包含半开间隔的库函数,因为当时这种想法在python中的使用还较少。

答案 4 :(得分:0)

实际上... randint()使用randrange()生成随机整数。

>>> randint(1.0,2.1)
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    randint(1.0,2.1)
  File "C:\Users\Anonymous\AppData\Local\Programs\Python\Python37\lib\random.py", line 222, in randint
    return self.randrange(a, b+1) <----- LOOK HERE
  File "C:\Users\Anonymous\AppData\Local\Programs\Python\Python37\lib\random.py", line 195, in randrange
    raise ValueError("non-integer stop for randrange()")
ValueError: non-integer stop for randrange()