Разница между случайным randint vs randrange
Единственное отличие, которое я знаю между 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?
Ответы
Ответ 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
предназначен для randint
когда у вас есть максимальное и минимальное значение для случайного числа, которое вы хотите.
Ответ 2
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)
Ответ 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
. Вы увидите сообщение об ошибке.
Ответ 4
Диапазон в 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!
В математике это называется полуоткрытым интервалом. 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!
Причина историческая:
- randint был добавлен в начале v1.5 около 1998 года, и это имя функции используется для генерации случайных чисел как с плавающей запятой в случайном порядке и целых числа в случайном порядке
- randrange был добавлен в python в v1.5.2. В версии 2.0 было добавлено уведомление о том, что randint устарела.
- уведомление об устаревании для randint было удалено
randint начинал как более ранняя библиотечная функция, которая не включала полуоткрытый интервал, потому что в то время эта идея была менее закреплена в python.