Générateur de nombres aléatoires

Générez un ou plusieurs nombres aléatoires dans n'importe quel intervalle, avec ou sans répétitions — grâce à une randomisation cryptographique.

1 449 vues

Comment les nombres sont vraiment générés

Tout « aléatoire » ne se vaut pas. Math.random(), disponible dans tous les navigateurs, est un générateur pseudo-aléatoire rapide — déterministe en coulisses et, en principe, prévisible pour quiconque connaît son état interne, ce qui le rend inadapté à tout usage sensible sur le plan de la sécurité, comme des tirages avec de vrais enjeux. Cet outil utilise à la place crypto.getRandomValues(), le générateur aléatoire cryptographiquement sûr intégré au navigateur, qui puise dans les sources d'entropie du système d'exploitation et n'est prévisible même pas en principe.

Disposer d'une source aléatoire sûre ne résout cependant que la moitié du problème. Faire correspondre naïvement une valeur aléatoire à une plage spécifique (disons 1-100) — en prenant random % 100 — introduit un biais de modulo subtil mais réel : comme la plage de sortie brute du générateur n'est généralement pas un multiple exact de 100, certains restes finissent très légèrement plus probables que d'autres. Le biais est faible, mais il est réel et s'accumule sur de nombreux tirages — exactement le genre de chose qui ne devrait pas exister dans une tombola censée être équitable.

La solution est l'échantillonnage par rejet : plutôt que de forcer chaque valeur brute dans la plage via un modulo, les valeurs brutes hors plage sont écartées et une nouvelle est tirée jusqu'à ce qu'elle s'inscrive proprement dans un multiple exact de la plage cible. Cela garantit une distribution véritablement uniforme — chaque nombre de la plage a une probabilité exactement égale — au prix d'un tirage supplémentaire occasionnel, imperceptible aux vitesses en jeu.

Choisissez un minimum, un maximum et le nombre de valeurs nécessaires ; cochez unique pour empêcher les répétitions, ce dont ont besoin les tombolas, tirages au sort, échantillonnages et jeux lorsque la même entrée ne doit pas gagner deux fois. Tout s'exécute sur l'appareil local — aucun nombre n'est transmis ni stocké nulle part, et actualiser la page produit un tirage entièrement nouveau.

Ce qu'il faut savoir

  • Le biais de modulo est invisible sur une poignée de tirages mais devient statistiquement détectable sur des milliers — l'échantillonnage par rejet l'élimine entièrement plutôt que de simplement le réduire.
  • Le fait que crypto.getRandomValues() soit « cryptographiquement sûr » signifie que sa sortie ne peut être prédite même par quelqu'un qui a vu les sorties précédentes — une propriété que Math.random() n'a explicitement pas et n'a jamais été conçu pour avoir.
  • La plage est inclusive aux deux extrémités : un tirage de 1 à 10 peut produire aussi bien 1 que 10, pas seulement les valeurs strictement comprises entre les deux.
  • Pour une tombola vérifiable, numérotez les participants de 1 à N, réglez la plage en conséquence, activez unique, et prenez une capture d'écran du résultat, car rien n'est stocké côté serveur après le tirage.

Questions fréquentes

Les nombres sont-ils vraiment aléatoires, ou juste « assez aléatoires » ?

Ils proviennent de crypto.getRandomValues(), qui puise dans la source d'entropie cryptographique du système d'exploitation - imprévisibles en principe, et pas seulement en pratique, contrairement au simple Math.random() utilisé par la plupart des scripts de nombres aléatoires ordinaires.

Qu'est-ce que le biais de modulo et cet outil en souffre-t-il ?

Faire correspondre naïvement une valeur aléatoire à une plage avec random % N favorise légèrement certains nombres par rapport à d'autres, car la plage brute du générateur n'est généralement pas un multiple exact de N. Cet outil l'évite grâce à l'échantillonnage par rejet : les valeurs brutes hors plage sont écartées et retirées jusqu'à ce qu'un résultat uniforme soit garanti.

Qu'est-ce que l'échantillonnage par rejet, en termes simples ?

Plutôt que de forcer chaque valeur aléatoire dans une plage avec une opération modulo, les valeurs qui introduiraient un biais sont simplement rejetées et une nouvelle est tirée - ce processus se répète jusqu'à obtenir une valeur qui s'inscrit parfaitement et uniformément dans la plage. Le coût est un tirage supplémentaire occasionnel ; le bénéfice est un résultat véritablement uniforme.

Puis-je l'utiliser pour un tirage au sort ?

Oui. Numérotez les participants de 1 à N, réglez la plage en conséquence, activez unique et générez autant de gagnants que nécessaire. Prenez une capture d'écran pour vos archives, car les résultats ne sont stockés nulle part après le tirage.

Le minimum et le maximum sont-ils tous deux inclus dans la plage ?

Oui - la plage est inclusive aux deux extrémités. Un tirage de 1 à 10 peut produire aussi bien 1 que 10, exactement comme si l'on tirait des bulletins numérotés d'un chapeau.

Commentaires

Pas encore de commentaires — soyez le premier à en écrire un !

Outils similaires