Randomizer
Générateur de nombres, listes et choix aléatoires
Tirer un gagnant
Mélanger une liste
Outils rapides
Probabilité 50/50
Historique récent
- Aucune activité récente dans cette session.
L'aleatoire informatique est pseudo-aleatoire (algorithme deterministe) sauf en utilisant une source cryptographique comme crypto.getRandomValues().
Qu’est-ce que le pseudo-aleatoire ?
Les ordinateurs sont des machines deterministes — ils executent les instructions dans une sequence previsible. Le veritable aleatoire necessite une source physique d’entropie : desintegration radioactive, bruit atmospherique ou fluctuations thermiques. Comme la plupart des programmes ne peuvent pas acceder directement a ces sources, ils utilisent a la place des generateurs de nombres pseudo-aleatoires (PRNG).
Un PRNG est un algorithme mathematique qui produit une sequence de nombres qui parait aleatoire mais qui est en realite entierement determinee par une valeur initiale appelee la graine (seed). Avec la meme graine, un PRNG produira toujours la meme sequence. Ce determinisme est invisible en utilisation normale car la graine est generalement derivee de sources imprevisibles comme l’horloge systeme ou les mouvements de la souris.
La qualite d’un PRNG se mesure par la capacite de sa sortie a resister a l’analyse statistique. Un bon PRNG produit des sequences qui passent les tests de randomisation — distribution uniforme, pas de schemas detectables, longues periodes avant repetition. Mais la randomisation statistique n’est pas la meme chose que la securite cryptographique.
Math.random() vs crypto.getRandomValues()
JavaScript propose deux approches fondamentalement differentes de l’aleatoire :
Math.random() retourne un nombre a virgule flottante entre 0 (inclus) et 1 (exclus). Il utilise un algorithme PRNG (generalement xorshift128+ dans les moteurs modernes) qui est rapide et statistiquement adequat pour la plupart des usages. Cependant, il n’est pas cryptographiquement securise — l’etat interne peut etre reconstruit a partir des sorties observees, permettant a un attaquant de predire les valeurs futures.
crypto.getRandomValues() remplit un tableau type avec des valeurs aleatoires cryptographiquement robustes puisees dans le pool d’entropie du systeme d’exploitation (/dev/urandom sous Linux, CryptGenRandom sous Windows). Ces valeurs sont adaptees aux applications sensibles en termes de securite comme la generation de mots de passe, de cles de chiffrement et de jetons de session.
| Propriete | Math.random() | crypto.getRandomValues() |
|---|---|---|
| Vitesse | Tres rapide | Legerement plus lent |
| Graine | Interne (auto) | Pool d’entropie de l’OS |
| Previsible | Oui (si etat connu) | Non |
| Cas d’usage | Jeux, melanges, UI | Mots de passe, jetons, crypto |
| Sortie | Flottant 0-1 | Tableau d’entiers |
La regle est simple : si quelqu’un pourrait tirer avantage de la prediction des valeurs “aleatoires”, utilisez crypto.getRandomValues(). Pour tout le reste, Math.random() convient.
Le melange de Fisher-Yates
Le melange de Fisher-Yates (egalement connu sous le nom de melange de Knuth) est l’algorithme standard pour reordonner aleatoirement une liste. Il produit une permutation non biaisee — chaque ordre possible a exactement la meme probabilite.
L’algorithme fonctionne en place en iterant du dernier element au premier. A chaque position, il echange l’element courant avec un element choisi aleatoirement dans la portion non encore melangee :
for i from n-1 down to 1:
j = random integer from 0 to i
swap array[i] and array[j]
Une erreur courante est le “melange naif” qui choisit une position aleatoire dans l’ensemble du tableau a chaque etape. Cela produit une distribution biaisee — certaines permutations apparaissent plus frequemment que d’autres. L’algorithme de Fisher-Yates evite ce probleme en reduisant l’intervalle de selection a chaque etape.
Aleatoire avec graine pour la reproductibilite
Bien que l’imprevisibilite soit generalement l’objectif, il existe des cas ou l’on souhaite un aleatoire reproductible :
- Tests : Les tests deterministes utilisant des donnees aleatoires necessitent la meme sequence a chaque execution pour eviter les resultats instables
- Generation procedurale : Les jeux et simulations generent le meme monde a partir de la meme graine, permettant le partage de “graines de monde” (Minecraft, Terraria)
- Simulations scientifiques : Les methodes de Monte-Carlo necessitent des sequences aleatoires reproductibles pour la revue par les pairs et la validation
Le Math.random() de JavaScript ne supporte pas le seeding explicite. Pour un aleatoire avec graine, utilisez des bibliotheques implementant des PRNG a graine comme Mersenne Twister ou mulberry32.
Cas d’utilisation courants
- Selection aleatoire : Choisir des gagnants d’un concours, selectionner des elements aleatoires pour une revue, ou constituer des groupes de tests A/B
- Melange : Randomiser des questions de quiz, l’ordre d’une playlist, des jeux de cartes ou des diapositives de presentation
- Echantillonnage : Tirer un sous-ensemble aleatoire d’un grand jeu de donnees pour l’analyse ou les tests
- Generation procedurale : Creer du contenu aleatoire mais deterministe — cartes, textures, noms ou donnees de test
- Equilibrage de charge : Distribuer aleatoirement les requetes entre les serveurs pour eviter les points chauds (avec une randomisation ponderee pour des capacites de serveur inegales)
Essayez ces exemples
Tire un gagnant aleatoire dans la liste en utilisant une source cryptographiquement sure. Chaque participant a une chance egale d'etre selectionne.
Alice
Bob
Charlie
Diana
Eve Tire une equipe au hasard dans la liste. Utile pour assigner des taches, choisir un ordre de passage ou prendre des decisions rapides.
Ingenierie
Design
Marketing
Produit
QA