Подтвердить что ты не робот

Разница между случайным 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?

4b9b3361

Ответ 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 когда у вас есть максимальное и минимальное значение для случайного числа, которое вы хотите.

Ответ 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.