Générateur de nombres aléatoires: comment les ordinateurs génèrent-ils des nombres aléatoires?

Les gens utilisent des nombres aléatoires depuis des millénaires, donc le concept n'est pas nouveau. De la loterie dans l'ancienne Babylone, aux tables de roulette de Monte Carlo, en passant par les jeux de dés à Vegas, le but est de laisser le résultat final au hasard.

Mais mis à part le jeu, le hasard a de nombreuses utilisations en science, en statistiques, en cryptographie et plus encore. Pourtant, l'utilisation de dés, de pièces de monnaie ou de supports similaires comme dispositif aléatoire a ses limites.

En raison de la nature mécanique de ces techniques, générer de grandes quantités de nombres aléatoires nécessite beaucoup de temps et de travail. Grâce à l'ingéniosité humaine, nous disposons d'outils et de méthodes plus puissants.

Méthodes de génération de nombres aléatoires

Vrais nombres aléatoires

Robot électronique de forme libre regardant autour

Considérons deux méthodes principales utilisées pour générer des nombres aléatoires. La première méthode estbasé sur un processus physique, et récolte la source du caractère aléatoire d'un phénomène physique qui devrait être aléatoire .

Un tel phénomène a lieu à l'extérieur de l'ordinateur. Il est mesuré et ajusté pour d'éventuels biais dus au processus de mesure. Les exemples incluent la désintégration radioactive, l'effet photoélectrique, le rayonnement de fond cosmique, le bruit atmosphérique (que nous utiliserons dans cet article), etc.

Ainsi, les nombres aléatoires générés sur la base d'un tel caractère aléatoire sont dits être des nombres aléatoires " vrais ".

Techniquement, la partie matérielle consiste en un dispositif qui convertit l'énergie d'une forme en une autre (par exemple, un rayonnement en un signal électrique), un amplificateur et un convertisseur analogique-numérique pour transformer la sortie en un nombre numérique.

Que sont les nombres pseudo-aléatoires?

Code d'attaque binaire de hacker.  Fabriqué avec Canon 5d Mark III et objectif vintage analogique, Leica APO Macro Elmarit-R 2.8 100mm (Année: 1993)

Au lieu de «vrais» nombres aléatoires, la deuxième méthode de génération de nombres aléatoires implique des algorithmes de calcul qui peuvent produire des résultats apparemment aléatoires.

Pourquoi apparemment aléatoire? Parce que les résultats finaux obtenus sont en fait complètement déterminée par une valeur initiale également connue sous le nom de pépins valeur ou clé . Par conséquent, si vous connaissiez la valeur de clé et le fonctionnement de l'algorithme, vous pourriez reproduire ces résultats apparemment aléatoires.

Les générateurs de nombres aléatoires de ce type sont fréquemment appelés générateurs de nombres pseudo- aléatoires et, par conséquent, produisent des nombres pseudo-aléatoires.

Même si ce type de générateur ne collecte généralement aucune donnée à partir de sources aléatoires naturelles, une telle collecte de clés peut être rendue possible si nécessaire.

Comparons certains aspects des vrais générateurs de nombres aléatoires ou TRNG et des générateurs de nombres pseudo-aléatoires ou PRNG .

Les PRNG sont plus rapides que les TRNG. En raison de leur nature déterministe, ils sont utiles lorsque vous devez rejouer une séquence d'événements aléatoires. Cela aide beaucoup dans les tests de code, par exemple.

D'un autre côté, les TRNG ne sont pas périodiques et fonctionnent mieux dans des rôles sensibles à la sécurité tels que le chiffrement.

Un point est le nombre d'itérations qu'un PRNG passe avant qu'il ne commence à se répéter. Ainsi, toutes choses étant égales par ailleurs, un PRNG avec une période plus longue nécessiterait plus de ressources informatiques pour prédire et craquer.

Exemple d'algorithme pour le générateur de nombres pseudo-aléatoires

Un ordinateur exécute un code basé sur un ensemble de règles à suivre. Pour les PRNG en général, ces règles tournent autour de ce qui suit:

  1. Acceptez un numéro d'entrée initial, c'est-à-dire une graine ou une clé.
  2. Appliquez cette graine dans une séquence d'opérations mathématiques pour générer le résultat. Ce résultat est le nombre aléatoire.
  3. Utilisez ce nombre aléatoire résultant comme la graine pour la prochaine itération.
  4. Répétez le processus pour émuler le caractère aléatoire.

Regardons maintenant un exemple.

Le générateur congruentiel linéaire

Ce générateur produit une série de nombres pseudo-aléatoires. Étant donné un germe initial X 0 et des paramètres entiers a comme multiplicateur, b comme incrément et m comme module, le générateur est défini par la relation linéaire: X n ≡ (aX n-1 + b) mod m . Ou en utilisant une syntaxe plus conviviale pour la programmation: X n = (a * X n-1 + b)% m .

Chacun de ces membres doit remplir les conditions suivantes:

  • m> 0 (le module est positif),
  • 0 <a <m (le multiplicateur est positif mais inférieur au module),
  • 0b <m (lel'incrément est non négatif mais inférieur au module), et
  • 0X 0 <m (la graine est non négative mais inférieure au module).

Créons une fonction JavaScript qui prend les valeurs initiales comme arguments et renvoie un tableau de nombres aléatoires d'une longueur donnée:

 // x0=seed; a=multiplier; b=increment; m=modulus; n=desired array length; const linearRandomGenerator = (x0, a, b, m, n) => { const results = [] for (let i = 0; i < n; i++) { x0 = (a * x0 + b) % m results.push(x0) } return results } 

Le générateur de congruence linéaire est l'un des algorithmes PRNG les plus anciens et les plus connus.

Quant aux algorithmes générateurs de nombres aléatoires exécutables par ordinateur, ils datent des années 40 et 50 (méthode du carré du milieu et générateur de Lehmer, par exemple) et continuent de s'écrire aujourd'hui (Xoroshiro128 +, Squares RNG, etc.) .

Un exemple de générateur de nombres aléatoires

Lorsque j'ai décidé d'écrire cet article sur l'intégration d'un générateur de nombres aléatoires dans une page Web, j'avais un choix à faire.

J'aurais pu utiliser la Math.random()fonction de JavaScript comme base et générer une sortie en nombres pseudo-aléatoires comme je l'ai fait dans les articles précédents (voir Multiplication Chart - Code Your Own Times Table).

Mais cet article lui-même concerne la génération de nombres aléatoires. J'ai donc décidé d'apprendre à collecter des données aléatoires "vraies" et de partager ma découverte avec vous.

Voici donc le "vrai" générateur de nombres aléatoires. Définissez les paramètres et appuyez sur Générer.

True Random Number Generator Binary Decimal Hexadecimal Generate Result:

The code fetches data from one of the APIs, courtesy of Random.org. This online resource has a plethora of useful, customizable tools and comes with excellent documentation to go with it.

The randomness comes from atmospheric noise. I was able to use asynchronous functions. That is a huge benefit going forward. The core function looks like this:

 // Generates a random number within user indicated interval const getRandom = async (min, max, base) => { const response = await  fetch("//www.random.org/integers/?num=1&min="+min+" &max="+max+"&col=1&base="+base+"&format=plain&rnd=new") return response.text() }

The parameters it takes allow a user to customize random number output. For example, min and max allow you to set lower and upper limits on generated output. And base determines if the output is printed as binary, decimal or hexadecimal.

Again, I chose this configuration but there are many more available at the source.

Lorsque vous cliquez sur le bouton Générer, la handleGenerate()fonction est appelée. Il appelle à son tour la getRandom()fonction asynchrone, gère la gestion des erreurs et génère les résultats:

 // Output handling const handleGenerate = () => { handleActive(generateButton) const base = binary.checked ? 2 : decimal.checked ? 10 : 16 if (!minimum.value || !maximum.value) { prompter.style.color = 'red' prompter.textContent = "Enter Min & Max values" } else { getRandom(minimum.value, maximum.value, base).then((data) => { resultValue.textContent = data prompter.textContent = "" }).catch((error) => { resultValue.textContent = 'ERROR' prompter.textContent = 'Connection error. Unable to generate'; }) handleRestart() } } 

Le reste du code traite de la structure, de l'apparence et du style HTML.

Le code est prêt à être intégré et utilisé dans cette page Web. Je l'ai séparé en composants et lui ai fourni des commentaires détaillés. Il peut être facilement modifié. Vous pouvez également modifier les fonctionnalités et les styles selon vos besoins.

Ceci est le lien vers le repo GitHub du code complet: //github.com/sandroarobeli/random-generator