Esistono due modi ovvi per generare una cifra casuale da 0 a 9 in Python. Si potrebbe generare un numero in virgola mobile casuale compreso tra 0 e 1, moltiplicarlo per 10 e arrotondare per difetto. In alternativa, si potrebbe usare il random.randint
metodo.
import random
def random_digit_1():
return int(10 * random.random())
def random_digit_2():
return random.randint(0, 9)
Ero curioso di sapere cosa accadrebbe se si generasse un numero casuale compreso tra 0 e 1 e si mantenesse l' ultima cifra. Non mi aspettavo necessariamente che la distribuzione fosse uniforme, ma ho trovato il risultato abbastanza sorprendente.
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)
Produzione:
Counter({1: 84206,
5: 130245,
3: 119433,
6: 129835,
8: 101488,
2: 100861,
9: 84796,
4: 129088,
7: 120048})
Di seguito è mostrato un istogramma. Si noti che 0 non viene visualizzato, poiché gli zeri finali vengono troncati. Qualcuno può spiegare perché le cifre 4, 5 e 6 sono più comuni delle altre? Ho usato Python 3.6.10, ma i risultati erano simili in Python 3.8.0a4.
str
lo converte in base-10 che è destinato a causare problemi. ad es. una mantissa float a 1 bit b0 -> 1.0
e b1 -> 1.5
. L '"ultima cifra" sarà sempre 0
o 5
.
random.randrange(10)
è ancora più ovvio, IMHO. random.randint
(che chiama random.randrange
sotto il cofano) è stata un'aggiunta successiva al random
modulo per le persone che non capiscono come funzionano i range in Python. ;)
randrange
realtà è arrivato secondo, dopo aver deciso che l' randint
interfaccia era un errore.