Есть два очевидных способа генерирования случайной цифры от 0 до 9 в Python. Можно сгенерировать случайное число с плавающей запятой между 0 и 1, умножить на 10 и округлить в меньшую сторону. В качестве альтернативы можно использовать random.randint
метод.
import random
def random_digit_1():
return int(10 * random.random())
def random_digit_2():
return random.randint(0, 9)
Мне было любопытно, что произойдет, если кто-то сгенерирует случайное число от 0 до 1 и сохранит последнюю цифру. Я не обязательно ожидал, что распределение будет равномерным, но я нашел результат довольно удивительным.
from random import random, seed
from collections import Counter
seed(0)
counts = Counter(int(str(random())[-1]) for _ in range(1_000_000))
print(counts)
Вывод:
Counter({1: 84206,
5: 130245,
3: 119433,
6: 129835,
8: 101488,
2: 100861,
9: 84796,
4: 129088,
7: 120048})
Гистограмма показана ниже. Обратите внимание, что 0 не появляется, так как конечные нули усекаются. Но кто-нибудь может объяснить, почему цифры 4, 5 и 6 встречаются чаще, чем остальные? Я использовал Python 3.6.10, но результаты были похожи в Python 3.8.0a4.
str
преобразует его в базу-10, которая обязательно вызовет проблемы. например, 1-битная плавающая мантисса b0 -> 1.0
и b1 -> 1.5
. «Последняя цифра» всегда будет 0
или 5
.
random.randrange(10)
Еще более очевидно, ИМХО. random.randint
(который вызывается random.randrange
изнутри) был более поздним дополнением к random
модулю для людей, которые не понимают, как диапазоны работают в Python. ;)
randrange
самом деле пришел вторым после того, как они решили, что randint
интерфейс был ошибкой.