Apprenez en lisant dans l'ordre

random et secrets — Choisir le bon type de nombres aléatoires

Apprends les modules random et secrets de Python depuis la base. Couvre les séquences pseudo-aléatoires reproductibles avec random.choice / randint / shuffle / sample plus seed, les jetons cryptographiquement sûrs avec secrets.token_hex / token_urlsafe, et quand utiliser l'un plutôt que l'autre — avec des exercices pratiques exécutables.

Cet article couvre les deux modules de nombres aléatoires de la bibliothèque standard. random fournit des valeurs pseudo-aléatoires pour les tests, jeux et simulations (reproductibles avec seed), et secrets fournit des valeurs imprévisibles pour mots de passe, jetons de réinitialisation et clés API (tirées de la source aléatoire cryptographique de l'OS). Choisir le bon pour le travail est le sujet du reste de l'article.

En quoi random et secrets diffèrent

Les deux modules retournent des nombres aléatoires, mais le mécanisme et les usages sont complètement différents. random est construit sur le Mersenne Twister (un générateur pseudo-aléatoire largement utilisé), et appeler random.seed(valeur) te permet de reproduire la même séquence. secrets, en revanche, tire de la source aléatoire cryptographique de l'OS (comme /dev/urandom), donc il n'y a pas de notion de `seed` et les valeurs sont imprévisibles à chaque fois.

Pour des cas comme les tests ou les jeux — « ce n'est pas grave si le résultat fuit » — utilise random. Pour mots de passe, jetons et identifiants de session — « quelqu'un qui prédirait la valeur causerait un incident de sécurité » — utilise secrets.

Quand utiliser random vs secrets
randomPseudo-aléatoire reproductiblemême séquence avec seedJeux / testssimulationssecretsCrypto imprévisiblepas de seedJetons / mots de passeID de session
random te donne des valeurs pseudo-aléatoires reproductibles — pour les tests et les jeux. secrets tire de la source cryptographique de l'OS des valeurs imprévisibles — pour les jetons et la génération de mots de passe. Choisis le bon pour le travail.
Aspectrandomsecrets
SourceMersenne Twister (algorithme)Source crypto de l'OS (/dev/urandom, etc.)
ReproductibilitéMême séquence reproductible avec seedNon reproductible (toujours différent)
VitesseRapidePlus lent (sans importance pour l'usage typique)
Meilleur usageTests, jeux, simulationsJetons, mots de passe, ID de session

random — Les bases (randint / uniform / choice)

Les bases de random sont trois choses : un entier aléatoire / un float aléatoire / choisir un élément d'une liste. random.randint(min, max) retourne un entier inclus aux deux bornes, random.uniform(min, max) retourne un float dans la plage donnée, et random.choice(liste) retourne un élément de la liste.

Commençons sans seed et observons comment ces fonctions de base se comportent.

Les fonctions de base de random
random.randint(a, b)→ entier dans [a, b]random.uniform(a, b)→ float dans [a, b]random.choice(liste)→ un élément
randint est un entier aléatoire dans une plage (deux bornes incluses), uniform est un float aléatoire dans une plage, et choice prend un élément d'une liste. La forme d'entrée et de retour diffère pour chacun, choisis donc selon ton besoin.
FonctionRetourUsage typique
random.randint(a, b)Entier dans [a, b] (deux bornes incluses)Lancers de dés, ID de test
random.uniform(a, b)Float dans [a, b]Bruit, simulations probabilistes
random.choice(seq)Un élément de la séquenceChoisir un item dans un menu

Essaie les trois fonctions random de base. Les valeurs sont différentes à chaque exécution, donc on les vérifie par vérifications de plage et d'appartenance au lieu de comparaison exacte.

① Importe random.

② Génère un entier dans 1〜100 avec random.randint et stocke-le dans n ; génère un float dans 0〜1 avec random.uniform et stocke-le dans f ; choisis un élément de ["Apple", "Banana", "Cherry"] avec random.choice et stocke-le dans picked.

③ Affiche si n est dans 1〜100, si f est dans 0〜1, et si picked est un membre de la liste originale, sous la forme int range: True / False, float range: True / False, in list: True / False.

(Si ton code s'exécute correctement, l'explication apparaîtra.)

Éditeur Python

Exécuter le code pour voir le résultat

random — Reproductibilité par seed et opérations sur collections

Voyons maintenant la reproductibilité de tests avec `random.seed` et les fonctions d'opération sur collections (shuffle / sample). Après avoir appelé random.seed(N), la même graine produit toujours la même séquence. random.shuffle(liste) mélange les éléments de la liste sur place, et random.sample(liste, k) retourne une nouvelle liste de k éléments uniques tirés d'elle.

seed / shuffle / sample
random.seed(valeur)→ fixer l'état internereproductiblerandom.shuffle(liste)→ mélange sur placeretourne Nonerandom.sample(liste, k)→ k items uniquesnouvelle liste
seed(valeur) fixe l'état interne, donc la même séquence se répète. shuffle réarrange la liste originale sur place (retourne None). sample retourne une nouvelle liste de k éléments uniques (l'original reste intouché).
FonctionRetourUsage typique
random.seed(value)None (initialise l'état interne)Tests reproductibles
random.shuffle(seq)None (mélange la liste originale)Randomiser l'ordre d'une liste
random.sample(seq, k)Nouvelle liste de k éléments uniquesTirer k répondants d'un sondage

Confirme qu'une valeur générée avec seed 42 correspond à une valeur générée à nouveau après réinitialisation à 42.

① Importe random.

② Mets la graine à 42, puis appelle random.randint(1, 100) une fois et stocke-le comme n1.

③ Remets la graine à 42, puis appelle random.randint(1, 100) à nouveau et stocke-le comme n2.

④ Affiche n1 == n2 sous reproducible: True.

Éditeur Python

Exécuter le code pour voir le résultat

Vois la différence entre shuffle (réarrange la liste elle-même) et sample (retourne une nouvelle liste).

① Mets la graine à 7 et prépare cards = [1, 2, 3, 4, 5].

② Appelle random.shuffle(cards) pour réarranger le contenu de cards sur place. Affiche cards réarrangé sous after shuffle: ◯◯.

③ Remets la graine à 7, puis appelle random.sample([1, 2, 3, 4, 5], 3) pour choisir 3 éléments uniques, et affiche le résultat sous picked 3: ◯◯.

Éditeur Python

Exécuter le code pour voir le résultat

secrets — Hasard fort pour la sécurité

Le module random des sections précédentes est un générateur pseudo-aléatoire pour les tests — si son état interne fuit, les valeurs suivantes peuvent être prédites. Pour des choses comme les jetons de réinitialisation de mot de passe, les clés API et les ID de session« si un attaquant peut prédire la valeur, tu as une vulnérabilité » — choisis le module `secrets`, qui utilise la source aléatoire cryptographique de l'OS.

secrets a une API beaucoup plus petite que random — ce sont surtout des helpers qui transforment des octets aléatoires en chaînes hex ou URL-safe.

FonctionRetourUsage typique
secrets.token_bytes(n)n octets aléatoiresClés crypto, jetons binaires internes
secrets.token_hex(n)Chaîne hex de longueur 2*nID de session de connexion
secrets.token_urlsafe(n)Chaîne URL-safe (style Base64)À intégrer dans des URLs de réinitialisation
secrets.choice(seq)Un élément de seq, cryptographiquementQuand l'ordre d'affichage ne doit pas être prévisible
secrets.compare_digest(a, b)True / False (résistant aux attaques temporelles)Comparaison de hash / jeton (à utiliser à la place de ==)

Génère des jetons de sécurité avec secrets et vérifie leur longueur et jeu de caractères. Les valeurs réelles changent à chaque exécution, donc on vérifie des propriétés comme la longueur.

① Importe secrets.

② Génère un jeton hex de 16 octets, affiche sa longueur sous hex length: ◯, puis vérifie qu'il contient uniquement des caractères 0-9 et a-f sous hex is hex only: True / False.

③ Génère un jeton URL-safe de 16 octets et affiche sa longueur sous urlsafe length: ◯.

Éditeur Python

Exécuter le code pour voir le résultat
QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Quel module utiliser pour générer un jeton de réinitialisation de mot de passe ?

Question 2Après avoir appelé random.seed(42) puis random.randint(1, 100), que se passe-t-il si tu refais la même chose ?

Question 3Quelle est la meilleure option quand tu veux qu'une liste mélangée aléatoirement soit reproductible pour les tests ?