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?
答案 0 :(得分:41)
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
元素,我想。我猜想,获取随机索引最有用。
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中都使用。
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最初是一个较早的不包含半开间隔的库函数,因为当时这种想法在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()