Un Générateur aléatoire est un outil ou un algorithme qui produit des résultats imprévisibles et non déterministes. Ces générateurs sont essentiels dans de nombreux domaines, de la cryptographie à la simulation informatique.
- Des résultats imprévisibles : Les générateurs de nombres aléatoires fournissent des résultats qui ne peuvent pas être prédits.
- Utilisation en cryptographie : Ils sont essentiels à la sécurité des communications.
- Simulations informatiques : Souvent utilisé dans la modélisation et l'analyse de systèmes complexes.
Générateur de nombres aléatoires
Comment fonctionne un générateur de nombres aléatoires ? ?
Les générateurs aléatoires fonctionnent soit avec des processus physiques, soit avec des algorithmes mathématiques. Les principaux types sont les générateurs de nombres aléatoires réels (TRNG) et les générateurs de nombres pseudo-aléatoires (PRNG).
Diverses applications du hasard ont conduit au développement de différentes méthodes de génération de données aléatoires. Certaines d'entre elles existent depuis l'Antiquité, notamment des exemples bien connus tels que le lancer de dés, le lancer de pièces, le mélange de cartes à jouer, l'utilisation de tiges d'achillée (pour la divination) dans le I Ching, ainsi que d'innombrables autres techniques. En raison de la nature mécanique de ces techniques, la génération de grandes quantités de nombres suffisamment aléatoires (importante en statistiques) demandait beaucoup de travail et de temps. C'est pourquoi les résultats étaient parfois collectés et distribués sous forme de tableaux de nombres aléatoires.
Il existe plusieurs méthodes de calcul pour générer des nombres pseudo-aléatoires. Toutes ne parviennent pas à atteindre l'objectif d'un vrai hasard, même si elles parviennent, à des degrés divers, à résoudre certains problèmes statistiques. Tests qui visent à mesurer le degré d'imprévisibilité de leurs résultats (c'est-à-dire dans quelle mesure leurs modèles sont reconnaissables). Cela les rend généralement inutilisables pour des applications telles que la cryptographie. Il existe toutefois des générateurs de nombres pseudo-aléatoires (CSPRNGS) soigneusement conçus et dotés de caractéristiques spéciales, qui sont spécifiquement destinés à l'utilisation cryptographique. Insérer ont été développés en cryptographie.
Applications des générateurs de nombres aléatoires
- Jeux et divertissement:
- Les générateurs de nombres aléatoires sont utilisés dans les jeux pour créer des éléments imprévisibles tels que les lancers de dés, les tirages de cartes ou la génération de niveaux.
- Cryptographie:
- Dans le domaine de la sécurité de l'information, les générateurs de nombres aléatoires sont essentiels pour générer les clés, les saltos et les nonces nécessaires au cryptage et à l'authentification.
- Statistiques et échantillonnage:
- Lors de la création d'échantillons pour des enquêtes et des études, les générateurs de nombres aléatoires aident à tirer des échantillons représentatifs et impartiaux.
- Modèles de simulation:
- En science et en ingénierie, les générateurs de nombres aléatoires sont utilisés pour effectuer des simulations de Monte Carlo, qui utilisent des variables aléatoires pour modéliser et analyser des systèmes complexes.
- Loteries et jeux-concours:
- Ils garantissent une sélection équitable et aléatoire des gagnants dans les loteries, les jeux et autres concours.
- Algorithmes d'optimisation:
- Les méthodes aléatoires, telles que les algorithmes génétiques et le simulacre d'anneaux, utilisent des générateurs aléatoires pour explorer efficacement les espaces de solutions et trouver des solutions optimales.
- Intelligence artificielle et machine Apprendre:
- Les générateurs aléatoires sont utilisés pour mélanger des ensembles de données et sélectionner aléatoirement des données d'entraînement et de test afin de valider et d'entraîner les modèles.
Les générateurs de nombres aléatoires ont des applications dans les jeux de hasard, l'échantillonnage statistique, la simulation informatique, la cryptographie, la conception entièrement aléatoire et d'autres domaines où la production d'un résultat imprévisible est souhaitable. En général, dans les applications où l'imprévisibilité est la caractéristique principale, comme dans les applications de sécurité, les générateurs matériels sont préférés lorsque cela est possible.
Les générateurs de nombres pseudo-aléatoires sont très utiles pour le développement de méthodes de simulation de Monte-Carlo, car le débogage est facilité par la possibilité de répéter la même séquence de nombres aléatoires en commençant par la même graine aléatoire. Elles sont également utilisées en cryptographie - tant que la graine reste secrète. L'expéditeur et le destinataire peuvent générer automatiquement le même ensemble de nombres afin de les utiliser comme clé.
La génération de nombres pseudo-aléatoires est une tâche importante et fréquente dans la programmation informatique. Alors que la cryptographie et certains algorithmes numériques requièrent un degré très élevé de caractère apparemment aléatoire, de nombreuses autres opérations ne nécessitent qu'un modeste degré d'imprévisibilité. Quelques exemples simples pourraient être de présenter à un utilisateur une "citation aléatoire du jour" ou de déterminer dans quelle direction un adversaire contrôlé par ordinateur pourrait se déplacer dans un jeu informatique. Des formes plus faibles d'aléa sont utilisées dans les algorithmes de hachage et dans la création d'algorithmes de recherche et de tri amortis.
Certaines applications qui semblent à première vue se prêter à la randomisation ne sont en réalité pas si simples. Par exemple, un système qui sélectionne "au hasard" des morceaux de musique pour un système de musique de fond doit paraître uniquement aléatoire et peut même avoir des possibilités de impôtsUn système vraiment aléatoire ne serait pas limité par le fait que le même titre pourrait apparaître deux ou trois fois de suite.
Nombres aléatoires réels vs. nombres pseudo-aléatoires ?
La différence entre les vrais nombres aléatoires et les nombres pseudo-aléatoires réside dans la prédictibilité et la source du caractère aléatoire.
- De vrais nombres aléatoires : Imprévisible, basé sur des processus physiques.
- Nombres pseudo-aléatoires : Généré par des algorithmes, prédictible si la graine est connue.
Il existe deux méthodes principales pour générer des nombres aléatoires. La première méthode mesure un phénomène physique considéré comme aléatoire, puis compense les éventuelles distorsions du processus de mesure. Des exemples de sources sont la mesure du bruit atmosphérique, du bruit thermique et d'autres phénomènes électromagnétiques et quantiques externes. Par exemple, le rayonnement cosmique de fond ou la désintégration radioactive, mesurés sur de courtes périodes, constituent des sources d'entropie naturelle (comme mesure de l'imprévisibilité ou de la surprise du processus de génération de nombres).
La vitesse à laquelle l'entropie peut être extraite des sources naturelles dépend des phénomènes physiques sous-jacents qui sont mesurés. C'est pourquoi on dit que les sources d'entropie "vraie" naturelle sont bloquantes - elles sont limitées en débit jusqu'à ce que suffisamment d'entropie soit collectée pour répondre à la demande. Sur certains systèmes de type Unix, y compris la plupart des distributions Linux, le pseudo-fichier de périphérique /dev/random bloque jusqu'à ce que suffisamment d'entropie soit collectée dans l'environnement. En raison de ce comportement bloquant, les grandes opérations de lecture de données en masse de /dev/random, comme le remplissage d'un disque dur avec des bits aléatoires, peuvent souvent être lentes sur les systèmes qui utilisent ce type de source d'entropie.
La deuxième méthode utilise des algorithmes de calcul qui peuvent générer de longues séquences de résultats apparemment aléatoires, qui sont en réalité entièrement déterminées par une valeur initiale plus courte, connue sous le nom de valeur de la graine ou de clé. Cela permet de reproduire la totalité de la séquence apparemment aléatoire lorsque la valeur de la graine est connue. Ce type de générateur de nombres aléatoires est souvent appelé générateur de nombres pseudo-aléatoires. Ce type de générateur est généralement non bloquant, de sorte qu'il n'est pas limité en débit par un événement externe, ce qui permet de grandes opérations de lecture de données en masse.
Certains systèmes utilisent une approche hybride qui collecte l'aléatoire à partir de sources naturelles, lorsqu'elles sont disponibles, et s'appuie sur des générateurs de nombres pseudo-aléatoires (CSPRNG) cryptographiquement sûrs, qui sont réensemencés périodiquement lorsque le taux de lecture souhaité dépasse la capacité de l'approche de collecte naturelle à répondre à la demande. Cette approche évite le comportement bloquant à débit limité des générateurs de nombres aléatoires basés sur des méthodes plus lentes et purement environnementales.
Où jouer au black jack en ligne ?
Les meilleures expériences de black jack ont été faites au Casino en direct Playamo a été faite. C'est là qu'on trouve, à mon avis, les MEILLEURE SÉLECTION à des tables avec des croupiers en direct et on peut très bien s'entraîner pour le vrai casino ! En comparaison avec d'autres casinos en ligne, les gains sont vraiment payés chez Playamo et c'est pourquoi je recommande définitivement le casino en ligne Playamo !
Le casino Playamo dispose de nombreuses tables de black jack en direct et d'une paiement rapide de Gagnez.
Alors qu'un générateur de nombres pseudo-aléatoires basé exclusivement sur la logique déterministe ne peut jamais être considéré comme une "vraie" source d'aléatoire au sens le plus pur du terme, ils sont généralement suffisants dans la pratique, même pour les applications critiques de sécurité les plus exigeantes. Des générateurs de nombres pseudo-aléatoires soigneusement conçus et mis en œuvre peuvent être certifiés à des fins cryptographiques critiques en termes de sécurité, comme c'est le cas des algorithmes Yarrow et Fortuna. Le premier est à la base de la source d'entropie /dev/random sur FreeBSD, AIX, macOS, NetBSD et d'autres. OpenBSD utilise un algorithme de nombres pseudo-aléatoires connu sous le nom de arc4random.
Méthodes de génération
Méthodes physiques
Les premières méthodes de génération de nombres aléatoires, comme le lancer de dés, le lancer de pièces et les roues de roulette, sont encore utilisées aujourd'hui, principalement dans les jeux et les paris, car elles sont trop lentes pour la plupart des applications statistiques et cryptographiques.
Un générateur physique de nombres aléatoires peut être basé sur un phénomène physique atomique ou subatomique essentiellement aléatoire, dont l'imprévisibilité peut être attribuée aux lois de la mécanique quantique. Les sources d'entropie comprennent la désintégration radioactive, le bruit thermique, le bruit de tir, le bruit d'avalanche dans les diodes Zener, les écarts d'horloge, les mouvements temporels d'une tête de lecture de disque dur et le bruit radio. Cependant, les phénomènes physiques et les outils utilisés pour les mesurer présentent généralement des asymétries et des distorsions systématiques qui ne rendent pas leurs résultats uniformément aléatoires. Un extracteur aléatoire, tel qu'une fonction de hachage cryptographique, peut être utilisé pour obtenir une distribution uniforme de bits à partir d'une source qui n'est pas uniformément aléatoire, mais à un débit binaire plus faible.
Un prototype de générateur de nombres aléatoires en temps réel et à grande vitesse basé sur un laser chaotique a été développé en 2013.
Plusieurs méthodes ingénieuses ont été développées pour collecter ces informations entropiques. Une technique consiste à appliquer une fonction de hachage à une trame d'un flux vidéo provenant d'une source imprévisible. Lavarand a utilisé cette technique avec des images de plusieurs lampes à lave. HotBits a mesuré la désintégration radioactive à l'aide de tubes Geiger-Müller, tandis que Random.org a enregistré les variations d'amplitude du bruit atmosphérique avec une radio normale.
Méthodes assistées par ordinateur
La plupart des nombres aléatoires générés par les ordinateurs utilisent des PRNG, qui sont des algorithmes capables de générer automatiquement de longues séquences de nombres avec de bonnes propriétés aléatoires, mais les séquences finissent par se répéter (ou la consommation de mémoire augmente indéfiniment). Ces nombres aléatoires sont suffisants dans de nombreuses situations, mais ne sont pas aussi aléatoires que les nombres utilisés comme source d'entropie à partir du bruit électromagnétique atmosphérique. La série de valeurs générées par de tels algorithmes est généralement déterminée par un nombre fixe, appelé "graine". L'un des PRNG les plus courants est le générateur de congruence linéaire, qui utilise la relation de récurrence
Xn+1=(aXn+b)mod mX_{n+1} = (aX_n + b) \mod mXn+1=(aXn+b)modm
est utilisé pour générer des nombres, où aaa, bbb et mmm sont de grands entiers, et Xn+1X_{n+1}Xn+1 est le nombre suivant dans une série de nombres pseudo-aléatoires. Le nombre maximal de nombres que la formule peut générer est le module mmm. La relation de récurrence peut être étendue aux matrices afin d'avoir des périodes beaucoup plus longues et de meilleures propriétés statistiques. Pour éviter certaines propriétés non aléatoires d'un seul générateur de nombres congruents linéaires, plusieurs générateurs de nombres aléatoires de ce type, avec des valeurs légèrement différentes du coefficient multiplicateur aaa, peuvent être utilisés en parallèle, un générateur de nombres aléatoires "maître" choisissant entre les différents générateurs.
Une méthode simple pour générer manuellement des nombres aléatoires est la méthode dite des carrés moyens, proposée par John von Neumann. Bien qu'elle soit simple à mettre en œuvre, sa sortie est de mauvaise qualité. Elle a une période très courte et de graves faiblesses, comme le fait que la séquence de sortie converge presque toujours vers zéro. Une innovation récente consiste à combiner la méthode des carrés moyens avec une séquence de Weyl. Cette méthode produit des sorties de haute qualité sur une longue période.
La plupart des langages de programmation contiennent des fonctions ou des routines de bibliothèque qui fournissent des générateurs de nombres aléatoires. Ils sont souvent conçus pour fournir un octet ou un mot aléatoire ou un nombre à virgule flottante uniformément réparti entre 0 et 1.
La qualité, c'est-à-dire le caractère aléatoire de telles fonctions de bibliothèque, varie considérablement, allant d'une sortie totalement prévisible à une sécurité cryptographique. Le générateur de nombres aléatoires standard dans de nombreux langages, y compris Python, Ruby, R, IDL et PHP, est basé sur l'algorithme de Mersenne-Twister et n'est pas suffisant à des fins cryptographiques, comme indiqué explicitement dans la documentation du langage. De telles fonctions de bibliothèque ont souvent de mauvaises propriétés statistiques et certaines répètent des modèles après seulement des dizaines de milliers d'essais. Elles sont souvent initialisées avec l'horloge en temps réel d'un ordinateur comme graine, car une telle horloge est de 64 bits et mesure en nanosecondes, bien au-delà de la précision d'une personne. Ces fonctions peuvent offrir suffisamment de hasard pour certaines tâches (par exemple les jeux vidéo), mais ne sont pas appropriées lorsqu'une grande qualité de hasard est requise, comme dans les applications cryptographiques ou statistiques.
Des générateurs de nombres aléatoires de meilleure qualité sont disponibles sur la plupart des systèmes d'exploitation ; par exemple /dev/random sur différents dérivés BSD, Linux, Mac OS X, IRIX et Solaris ou CryptGenRandom pour Microsoft Windows. La plupart des langages de programmation, y compris ceux mentionnés ci-dessus, offrent un moyen d'accéder à ces sources de plus haut niveau.
Généré par l'homme
La génération de nombres aléatoires peut également être effectuée par des humains, en collectant différentes entrées d'utilisateurs finaux et en les utilisant comme source aléatoire. Cependant, la plupart des études constatent que les sujets humains présentent un certain degré de non-aléatoire lorsqu'ils tentent de générer une séquence aléatoire de chiffres ou de lettres, par exemple. Ils pourraient passer trop souvent d'un choix à l'autre par rapport à un bon générateur de nombres aléatoires ; cette approche n'est donc pas largement utilisée. Pour la même raison que les humains réussissent mal cette tâche, la génération humaine de nombres aléatoires peut être utilisée comme outil pour obtenir un aperçu des fonctions cérébrales qui ne sont pas accessibles par d'autres moyens.
Suivi et contrôles statistiques
Même avec une source de nombres aléatoires plausible (peut-être d'un générateur matériel basé sur la mécanique quantique), il faut faire preuve de prudence pour obtenir des nombres totalement impartiaux. Le comportement de ces générateurs change souvent avec la température, la tension d'alimentation, l'âge de l'appareil ou d'autres influences extérieures.
Les nombres aléatoires générés sont parfois soumis à des tests statistiques avant d'être utilisés, afin de s'assurer que la source sous-jacente fonctionne toujours, et sont ensuite post-traités pour améliorer leurs propriétés statistiques. Un exemple serait le générateur matériel de nombres aléatoires TRNG9803, qui utilise une mesure d'entropie comme test matériel, puis retravaille la séquence aléatoire à l'aide d'un zélateur de flux de registres à décalage. Il est généralement difficile d'utiliser des tests statistiques pour valider les nombres aléatoires générés. Wang et Nicol ont proposé une technique de test statistique basée sur les distances, utilisée pour identifier les faiblesses de plusieurs générateurs de nombres aléatoires. Li et Wang ont proposé une méthode de test des nombres aléatoires basée sur les sources d'entropie chaotiques laser en utilisant les propriétés du mouvement brownien.
Les tests statistiques sont également utilisés pour donner confiance dans le fait que la sortie finale post-traitée d'un générateur de nombres aléatoires est réellement impartiale, de nombreux ensembles de tests aléatoires ayant été développés.
Autres considérations
Ajuster la distribution
Distributions équidistantes
La plupart des générateurs de nombres aléatoires fonctionnent nativement avec des entiers ou des bits individuels, c'est pourquoi une étape supplémentaire est nécessaire pour obtenir une distribution égale "canonique" entre 0 et 1. L'implémentation n'est pas aussi triviale que la division d'un nombre entier par sa valeur maximale possible. Concrètement
- L'entier qui entre dans la transformation doit fournir suffisamment de bits pour la précision voulue.
- La nature même de l'arithmétique en virgule flottante signifie que plus le nombre est proche de zéro, plus il y a de précision. Cette précision supplémentaire n'est généralement pas utilisée en raison du nombre de bits requis.
- Les erreurs d'arrondi lors de la division peuvent fausser le résultat. Dans le pire des cas, une zone prétendument exclue peut être tirée avec des nombres réels, contrairement aux attentes des mathématiques.
L'algorithme mainstream utilisé par OpenJDK, Rust et NumPy est décrit dans une proposition pour le STL de C++. Il n'utilise pas la précision supplémentaire et ne souffre de distorsions que dans le dernier bit en raison de l'arrondi au nombre pair suivant. D'autres préoccupations numériques sont justifiées lorsque cette distribution égale "canonique" est déplacée vers un autre domaine. Une méthode proposée pour le langage de programmation Swift prétend utiliser partout la précision totale.
Les entiers uniformément répartis sont souvent utilisés dans des algorithmes tels que le shuffle de Fisher-Yates. Là encore, une implémentation naïve peut introduire un biais modulo dans le résultat, d'où la nécessité d'utiliser des algorithmes plus élaborés. Une méthode qui n'effectue presque jamais de division a été décrite par Daniel Lemire en 2018, l'état de l'art actuel étant "l'algorithme optimal" inspiré du codage arithmétique de Stephen Canon d'Apple Inc. en 2021.
La plupart des RNG de 0 à 1 incluent 0, mais excluent 1, tandis que d'autres incluent ou excluent les deux.
Autres distributions
En présence d'une source de nombres aléatoires uniformément distribués, il existe plusieurs méthodes pour créer une nouvelle source aléatoire correspondant à une fonction de densité de probabilité. Une méthode, appelée méthode d'inversion, consiste à intégrer jusqu'à une plage supérieure ou égale au nombre aléatoire (qui doit être généré entre 0 et 1 pour des distributions correctes). Une seconde méthode, appelée méthode d'acceptation-rejet, consiste à choisir une valeur x et une valeur y et à tester si la fonction de x est supérieure à la valeur y. Si c'est le cas, la valeur x est acceptée. Dans le cas contraire, la valeur x