Это всегда казалось странным для меня это random.randint(a, b)
возвратил бы целое число в диапазоне [a, b]
, вместо [a, b-1]
как range(...)
.
Есть ли какая-либо причина этого очевидного несоответствия?
Я попытался разобраться в этом, изучив некоторые старые источники. Я подозревал , что randint
был реализован до длинного целого числа Python: это означает, что если вам нужно случайное число, включающее INT_MAX
, вам нужно будет вызвать random.randrange (0, INT_MAX + 1)
, что могло бы привести к переполнению и привести к аргументам (0, 0)
или (0, INT_MIN)
в зависимости.
Однако, оглядываясь еще на исходники Python 1.5.2 , в Lib / whrandom.py
мы видим:
#
# Get a random integer in the range [a, b] including both end points.
# (Deprecated; use randrange below.)
#
def randint(self, a, b):
return self.randrange(a, b+1)
whrandom.randint
был продолжен будет объявлено устаревшим в 2.0 , 2.1 , 2.2 и 2.3 ; но random.randint
был отмечен как устаревший в 2.1 , хотя больше не отмечен как устаревший в 2.2 .
Кроме того, random.py
из версии 2.1 является первым, что было отмечено в строке документации random.randint
:
def randrange(self, start, stop=None, step=1, int=int, default=None):
"""Choose a random item from range(start, stop[, step]).
This fixes the problem with randint() which includes the
endpoint; in Python this is usually not what you want.
Do not supply the 'int' and 'default' arguments.
"""
Единственный доступный источник старше этого исходный код 0.9.1 , и, насколько я могу судить, randint
на тот момент не был реализован.
Таким образом, я прихожу к выводу, что аргументация randint
, включающая конечную точку, известна только самому Гвидо на данный момент; учитывая строку документации из Python 2.1, похоже, что причина могла быть в простой ошибке.
Я не думаю, что для этого есть причина. Но, по крайней мере, это задокументировано.
Это предположение, но нормальное человеческое использование «дайте мне случайное число от a до b» включительно. Реализация этого способа имеет смысл, учитывая общую философию Python, заключающуюся в том, чтобы быть более понятным для человека языком.
Думаю, random.randint
была лишь первой попыткой реализовать эту функцию. Похоже, что разработчики Python также почувствовали, что это проблема, поэтому в v1.5.2 они добавили еще один метод randrange с более стандартными параметрами:
random.randrange ([start], stop [ , step])
Возвращает случайно выбранный элемент из диапазона (start, stop, step). Это эквивалентно выбору (диапазон (начало, остановка, шаг)), но на самом деле не создает объект диапазона.
Вы можете использовать randrange
вместо randint
, чтобы не удивлять людей.
С другой стороны, во многих ситуациях, когда проблема формулируется как «выберите случайное число от 1 до 6», может быть более естественным использовать randint (1, 6)
вместо записи randrange (1, 7)
или randrange (min, max + 1)
.