Python: почему делает 'random.randint (a, b)' возвращают диапазон включительно 'b'?

Это всегда казалось странным для меня это random.randint(a, b) возвратил бы целое число в диапазоне [a, b], вместо [a, b-1] как range(...).

Есть ли какая-либо причина этого очевидного несоответствия?

40
задан David Wolever 2 April 2010 в 19:38
поделиться

4 ответа

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

78
ответ дан 27 November 2019 в 01:18
поделиться

Я не думаю, что для этого есть причина. Но, по крайней мере, это задокументировано.

3
ответ дан 27 November 2019 в 01:18
поделиться

Это предположение, но нормальное человеческое использование «дайте мне случайное число от a до b» включительно. Реализация этого способа имеет смысл, учитывая общую философию Python, заключающуюся в том, чтобы быть более понятным для человека языком.

9
ответ дан 27 November 2019 в 01:18
поделиться

Думаю, 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) .

11
ответ дан 27 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: