Comment fonctionnent les générateurs de nombres aléatoires

Tous les hasards ne sont pas égaux. La différence entre un générateur de nombres pseudo-aléatoire et un générateur cryptographiquement sécurisé détermine si votre flip de pièce, le rouleau de dés ou le tirage de nom est vraiment juste — ou tranquillement prévisible.


Qu'est-ce qu'un générateur de nombre aléatoire?

Un générateur de nombres aléatoires (RNG) est un algorithme ou un périphérique matériel qui produit une séquence de nombres sans motif perceptible. Les ordinateurs sont confrontés à un problème fondamental : ce sont des machines déterministes. Compte tenu du même état de départ, un processeur produira toujours la même sortie. Le vrai hasard matériel exige une source externe d'imprévisibilité, appelée entropie, comme le bruit thermique, la variation du temps du disque ou le mouvement de la souris.

Les RNG logiciels résolvent cela soit en recueillant de l'entropie réelle du système d'exploitation, soit en utilisant une formule mathématique pour simuler le hasard. Ces deux approches produisent des résultats très différents.

Générateurs de nombres de Pseudo-Random (PRNG)

Un générateur de nombres pseudo-aléatoire (PRNG) commence à partir de l'état interne et applique un algorithme déterministe pour produire chaque nombre successif. La sortie peut sembler aléatoire, mais le même état initial produit la même séquence.

JavaScript Math.random() utilise un PRNG défini par l'implémentation. La spécification JavaScript ne nécessite pas d'algorithme particulier et ne rend pas explicitement la sortie cryptographiquement sécurisée. Il est donc inapproprié lorsqu'il s'agit d'imprévisibilité ou d'équité vérifiable.

Pour la plupart des fins — les animations, le brouillage d'une liste de lecture, le choix d'une couleur de fond aléatoire — cela n'a pas d'importance. Mais pour toute chose où l'équité est en jeu (voyages, tirages en équipe, résultats du jeu), la prévisibilité est un véritable problème.

Sécurité cryptographique des PRNG (CSPRNG)

Un générateur de nombres pseudo-aléatoire (CSPRNG) est conçu pour que les sorties antérieures ne rendent pas les sorties futures pratiquement prévisibles. Par rapport à un PRNG à usage général, il fournit les propriétés nécessaires aux applications sensibles à la sécurité et à l'équité :

  • Invisibilité à la prochaine période : La connaissance d'un certain nombre d'extrants précédents ne donne aucun avantage statistiquement significatif dans la prévision de la prochaine sortie.
  • Entropie forte de la plate-forme: Le générateur est ensemencé et rafraîchi par le système d'exploitation plutôt que des horodatages d'application ou d'autres valeurs facilement devinées.

Les navigateurs obtiennent des valeurs cryptographiques fortes des installations du système d'exploitation. Les sources et algorithmes exacts d'entropie sont des détails de plate-forme, de sorte que les applications Web devraient utiliser l'API Web Crypto plutôt que de tenter de collecter ou de gérer l'entropie eux-mêmes.

L'API Web Crypto : crypto.getRandomValues()

Les navigateurs exposent la fonctionnalité CSPRNG via l'API Web Crypto. La fonction clé est crypto.getRandomValues(typedArray), qui remplit un tableau dactylographié avec des octets cryptographiques aléatoires provenant du pool d'entropie OS.

Pour générer un entier non biaisé dans une gamme, Randly lit une valeur de 32 bits (ou combine des valeurs pour des gammes plus larges de coffre-fort) et rejette la queue courte qui créerait autrement un biais modulo :

fonction aléatoireUint32() {

tableau const = nouveau Uint32Array(1);

crypto.getRandomValues(array);

tableau de retour[0];

}

fonction aléatoireInt(min, max) {

gamme de const = max - min + 1;

limite de const = Math.floor(2 ** 32 / range) * portée;

laisser la valeur;

faire valeur = aléatoireUint32(); pendant que (valeur >= limite);

retour min + (intervalle de valeur %);

}

A Uint32Array fournit 232 valeurs possibles; Randly combine 53 bits lorsqu'une plage plus large d'entiers sûrs est nécessaire. L'échantillonnage de rejet garantit que chaque sortie dans la plage demandée correspond au même nombre de valeurs de source, de sorte qu'aucun résultat ne reçoit une part plus importante simplement parce que la plage demandée ne divise pas uniformément la plage de source.

Pourquoi ça compte pour l'équité

Pour la plupart des usages occasionnels, la distinction est invisible. Mais considérez un enseignant de classe qui utilise un sélectionneur de noms pour faire appel à des étudiants, ou une organisation qui gère un tirage au sort. Un PRNG à usage général n'est pas spécifié pour une utilisation contradictoire, tandis qu'une plateforme CSPRNG est conçue pour maintenir les valeurs futures imprévisibles. Un processus vérifié est toujours approprié pour les tirages réglementés ou de grande valeur.

Math.random() (PRNG)

  • • Déterministe vu la semence
  • • Pas de garantie d'imprévisibilité cryptographique
  • • Rapide — adapté aux animations et aux visuels
  • • Ne convient pas pour la sécurité ou les tirages équitables

crypto.getRandomValues() (CSPRNG)

  • • Fourni par le système d'exploitation CSPRNG
  • • Conçu pour résister à la prédiction de sortie
  • • Un peu plus lent (négligeable pour l'utilisation des outils)
  • • Préjudice approprié pour assurer la sécurité du hasard

Comment Randly utilise le hasard

Chaque outil sur Randly — rouleaux de dés, flips de pièce, pics de nom, tours de roue, génération de couleurs — utilise crypto.getRandomValues() exclusivement. La mise en œuvre se déroule dans un seul module partagé (lib/random.ts) qui exportent des fonctions dactylographiées: randomInt(min, max), Indice aléatoire(longueur), Au hasardÉlément(recours)et shuffleArray(array).

Pas d'appel Math.random() existe dans toute logique d'outil. Les seules valeurs standard de PRNG apparaissent dans les paramètres d'animation Framer Motion (positions de départ des éléments flottants), qui sont purement cosmétiques et n'ont aucun effet sur les résultats de l'outil.

Des idées fausses communes

"Cliquer plus vite rend le résultat plus aléatoire."

Le temps de votre clic n'a aucun effet lorsque vous utilisez un CSPRNG. Le pool d'entropie est continuellement rafraîchi par le système d'exploitation indépendamment de l'interaction utilisateur.

"Runner le même outil deux fois dans une rangée donne des résultats corrélés."

Chaque appel à crypto.getRandomValues() est indépendant. Les produits précédents ne fournissent aucune information sur les futurs produits.

"Une liste plus longue signifie que quelqu'un à la fin est moins susceptible d'être choisi."

La sélection aléatoire de l'index donne à chaque position une probabilité égale de 1/n, quelle que soit la longueur de la liste.


Essayez les outils

Tous les outils Randly utilisent la sécurité cryptographique aléatoire. Aucune inscription requise.

→ Sélecteur aléatoire de noms→ Rouleaux à dés (d2–d100)→ Flip de pièce→ Spinner de roue

Randly

De petits outils pour décider plus facilement.

Tous les outilsFeuille de routeConfidentialitéConditionsContactDécouvrirAide

© 2026 Randly. Tous droits réservés.