Il existe deux façons évidentes de générer un chiffre aléatoire de 0 à 9 en Python. On pourrait générer un nombre à virgule flottante aléatoire entre 0 et 1, multiplier par 10 et arrondir vers le bas. Alternativement, on pourrait utiliser la random.randint
méthode.
import random
def random_digit_1():
return int(10 * random.random())
def random_digit_2():
return random.randint(0, 9)
J'étais curieux de savoir ce qui se passerait si l'on générait un nombre aléatoire entre 0 et 1 et conservait le dernier chiffre. Je ne m'attendais pas nécessairement à une distribution uniforme, mais j'ai trouvé le résultat assez surprenant.
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)
Production:
Counter({1: 84206,
5: 130245,
3: 119433,
6: 129835,
8: 101488,
2: 100861,
9: 84796,
4: 129088,
7: 120048})
Un histogramme est illustré ci-dessous. Notez que 0 n'apparaît pas, car les zéros de fin sont tronqués. Mais quelqu'un peut-il expliquer pourquoi les chiffres 4, 5 et 6 sont plus courants que les autres? J'ai utilisé Python 3.6.10, mais les résultats étaient similaires dans Python 3.8.0a4.
str
le convertit en base-10 qui est susceptible de causer des problèmes. par exemple une mantisse flottante à 1 bit b0 -> 1.0
et b1 -> 1.5
. Le "dernier chiffre" sera toujours 0
ou 5
.
random.randrange(10)
est encore plus évident, à mon humble avis. random.randint
(qui appelle random.randrange
sous le capot) a été ajouté ultérieurement au random
module pour les personnes qui ne comprennent pas comment les plages fonctionnent en Python. ;)
randrange
est arrivé en deuxième position, après avoir décidé que l' randint
interface était une erreur.