Demander un résultat « aléatoire » est facile ; obtenir le bon résultat l’est étonnamment moins. La différence entre un générateur fiable pour une tombola et un générateur qui favorise discrètement certains nombres tient à quelques principes : l’origine de l’aléa, la façon de le mapper sur votre plage et le besoin d’un tirage imprévisible ou reproductible. Ce générateur tient compte de ces distinctions : sécurisé par cryptographie par défaut, sans biais de conception et doté d’un mode avec graine lorsque la reproductibilité compte davantage que le secret. Les sections suivantes expliquent le fonctionnement interne et vous aident à choisir les bons paramètres.

Aléatoire véritable ou pseudo-aléatoire

Il existe deux familles de générateurs aléatoires. Un générateur à aléatoire véritable (ou matériel) tire son imprévisibilité d’un processus physique : bruit électrique, variations de synchronisation ou désintégration radioactive. Un générateur pseudo-aléatoire (PRNG) applique une formule déterministe à partir d’une graine ; ses résultats semblent aléatoires et réussissent les tests statistiques, mais toute la séquence est fixée dès que la graine est connue.

Votre navigateur fait le lien entre les deux. crypto.getRandomValues — la source utilisée par défaut par cet outil — est un PRNG cryptographiquement sûr, réinitialisé en continu à partir du réservoir d’entropie matérielle du système d’exploitation. En pratique, ses résultats sont imprévisibles et sans biais ; c’est donc le bon choix pour les tombolas, les jetons de sécurité et toute situation où quelqu’un pourrait avoir intérêt à deviner la valeur suivante. L’ancienne fonction Math.random est un PRNG ordinaire sans garantie de sécurité ; elle n’est volontairement pas utilisée ici.

Le biais de modulo et sa correction par échantillonnage par rejet

La plupart des petits générateurs aléatoires faits maison commettent cette erreur. Pour convertir un grand nombre aléatoire en un nombre compris, par exemple, entre 1 et 6, le réflexe est de prendre le reste : 1 + (x mod 6). Le problème est que la source offre 2³² valeurs possibles et que 2³² n’est pas divisible par 6. Les valeurs restantes en haut de la plage reviennent au début, ce qui rend 1, 2, 3 et 4 très légèrement plus probables que 5 et 6. Avec un dé à six faces, l’écart est minime ; sur une grande plage ou après des millions de tirages, il devient mesurable — et constitue une vraie faiblesse en matière de sécurité.

La solution est l’échantillonnage par rejet : calculez le plus grand multiple de la taille de la plage qui tient dans 2³², tirez des valeurs brutes et écartez celles qui tombent dans la tranche restante avant de prendre le reste. Quelques tirages sont rejetés, mais tous les entiers de la plage ont exactement la même probabilité. Ce générateur applique cette méthode à chaque entier produit : « 1–6 » correspond bien à un dé équilibré et « 1–10,000 » à une distribution uniforme.

Tirages sans répétition ou avec répétition : des choix équitables à la loterie

Le mode « Autoriser les répétitions » effectue un tirage avec remise : chaque valeur est indépendante et le même nombre peut apparaître plusieurs fois — c’est le bon modèle pour les dés et les lancers de pièce. Le mode « Sans répétition » effectue un tirage sans remise : chaque valeur apparaît au plus une fois, comme pour une tombola, le choix de membres d’une équipe ou une ligne de loterie. Pour obtenir des valeurs distinctes, le générateur mélange la liste admissible avec un algorithme Fisher–Yates partiel et retient les k premières valeurs. Toutes les combinaisons restent ainsi aussi probables les unes que les autres, sans doublon.

Deux précautions sont à connaître. Le nombre de valeurs distinctes tirées ne peut pas dépasser la taille de la plage : demander 10 nombres distincts parmi 1–6 est impossible ; l’outil en tire donc autant que possible et affiche un avertissement. La liste d’exclusion retire certaines valeurs (un gagnant déjà tiré, un 13 porte-malheur) avant le tirage, ce qui réduit aussi la taille de la plage disponible en mode sans répétition.

Quand utiliser une graine (reproductibilité)

La plupart du temps, vous recherchez un aléa impossible à prévoir : le mode cryptographiquement sûr est alors le bon choix. Mais il arrive que vous souhaitiez le contraire : pouvoir répéter un tirage à l’identique. C’est le rôle de la graine. En mode Avec graine, les nombres sont produits par mulberry32, un PRNG déterministe ; avec les mêmes paramètres et la même graine, vous obtiendrez toujours les mêmes valeurs.

Cela peut être très utile. Une chercheuse peut publier la graine avec une étude pour rendre l’échantillon reproductible. Un organisateur de tombola peut l’annoncer à l’avance afin que les participants vérifient le tirage après coup. Un développeur peut initialiser les données de test pour reproduire les échecs. En contrepartie, toute personne qui connaît la graine peut prévoir une séquence initialisée ainsi : n’utilisez donc jamais ce mode pour créer des mots de passe, des clés ou tout élément qui doit rester secret.

Le tirage est-il équitable ? Lire la distribution

La question « ce tirage est-il vraiment aléatoire ? » est légitime ; l’onglet Statistiques permet d’y répondre. Un petit tirage isolé ne révèle pas grand-chose : cinq nombres entre 1 et 100 ne seront pas répartis régulièrement, et c’est normal. Le véritable hasard forme des grappes, il n’est pas bien ordonné. La tendance n’apparaît qu’à grande échelle. Lancez un dé quelques centaines de fois ou générez un grand échantillon : les barres de fréquence se rapprocheront alors d’une hauteur égale, signature visuelle d’une loi uniforme.

C’est aussi le moyen de contrer le sophisme du joueur. Après cinq résultats identiques, l’autre côté de la pièce n’est pas « dû » : chaque lancer reste indépendant et conserve une probabilité de 50/50. La proportion observée se rapproche progressivement de 50 % à mesure que le nombre de lancers augmente (loi des grands nombres), sans qu’un lancer soit influencé par ceux qui l’ont précédé.