Istnieją dwa oczywiste sposoby generowania losowej cyfry od 0 do 9 w Pythonie. Można wygenerować losową liczbę zmiennoprzecinkową między 0 a 1, pomnożyć przez 10 i zaokrąglić w dół. Alternatywnie można użyć tej random.randint
metody.
import random
def random_digit_1():
return int(10 * random.random())
def random_digit_2():
return random.randint(0, 9)
Byłem ciekawy, co by się stało, gdyby ktoś wygenerował losową liczbę od 0 do 1 i zachował ostatnią cyfrę. Niekoniecznie spodziewałem się, że rozkład będzie jednolity, ale wynik był dość zaskakujący.
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)
Wynik:
Counter({1: 84206,
5: 130245,
3: 119433,
6: 129835,
8: 101488,
2: 100861,
9: 84796,
4: 129088,
7: 120048})
Histogram pokazano poniżej. Zauważ, że 0 nie pojawia się, ponieważ końcowe zera są obcinane. Ale czy ktoś może wyjaśnić, dlaczego cyfry 4, 5 i 6 są bardziej powszechne niż reszta? Użyłem Python 3.6.10, ale wyniki były podobne w Python 3.8.0a4.
str
konwertuje go do base-10, co z pewnością spowoduje problemy. np. 1-bitowa mantysa pływaka b0 -> 1.0
i b1 -> 1.5
. „Ostatnią cyfrą” będzie zawsze 0
lub 5
.
random.randrange(10)
jest jeszcze bardziej oczywiste, IMHO. random.randint
(który wywołuje random.randrange
pod maską) był późniejszym dodatkiem do random
modułu dla osób, które nie rozumieją, jak działają zakresy w Pythonie. ;)
randrange
właściwie zajął drugie miejsce po tym, jak zdecydowali, że randint
interfejs jest błędem.