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


23

Je réfléchissais simplement à la rand()fonction php , et je pensais à comment je pouvais la refaire, et je suis tombé complètement stupéfait.

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


2
Les générateurs de nombres pseudo aléatoires utilisent une graine, un tableau de constantes prédéfinies et des formules mathématiques. Les vrais générateurs de nombres aléatoires utilisent généralement le bruit atmosphérique. Vous pouvez facilement obtenir des nombres aléatoires en lisant / dev / random.
droite le

Le bruit atmosphérique est-il garanti d'être aléatoire?


14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Neil

3
Quelqu'un doit le faire: xkcd.com/221 ;)
Valera Kolupaev

Réponses:


7

Les générateurs de nombres aléatoires (RNG) génèrent vraiment des nombres pseudo-aléatoires, car il est impossible de générer réellement un nombre vraiment aléatoire. Les seules choses vraiment vraiment aléatoires sont les actes de Dieu, comme la foudre.

Cet article wikipedia pourrait vous aider dans l'explication: http://en.wikipedia.org/wiki/Random_number_generators


D'après ce que je comprends, il y a essentiellement deux parties d'un RNG: la graine, puis le nombre aléatoire choisi dans cette graine. Lorsque vous amorcez le RNG, vous lui donnez un équivalent à un point de départ. Ce point de départ a alors un tas de nombres qui sont "à l'intérieur" de celui que le programme choisit. En PHP, vous pouvez utiliser srand () pour "mélanger" les graines, donc vous obtenez presque toujours une réponse différente. Vous pouvez ensuite utiliser rand (min, max) pour entrer dans la graine et choisir un nombre entre le min et le max, inclus.


AVERTISSEMENT, ANALOGIE AU FROMAGE POSSIBLE À VENIR!

Considérez chaque «graine» comme une glacière, puis les nombres aléatoires comme des glaçons. Disons que vous avez 1000 coffres à glace et que chaque coffre contient 1000 cubes de glace à l'intérieur. À la foire du comté, ils choisiront une glacière pour commencer à utiliser pour les boissons, et ils ne peuvent utiliser qu'un seul glaçon. Cependant, ils n'ont besoin que de glaçons de plus de 1 pouce cube. Ils choisiront donc un coffre au hasard parmi ces 1000 coffres, puis ils choisiront un cube de glace à l'intérieur de ce coffre au hasard. Si cela fonctionne pour la taille souhaitée, ils l'utilisent. Si ce n'est pas le cas, ils le remettent dans la poitrine avec les autres. S'ils veulent le rendre un peu plus amusant, ils changent de coffre à l'avance pour une totale inconscience, si vous voulez!

Quant à la façon dont PHP choisit physiquement la graine et le nombre aléatoire, je n'ai pas assez de connaissances pour cela (c'est probablement ce que vous vous demandiez le plus!). Je n'essaierais pas de refaire la fonction rand (); pour la plupart des applications Web que vous ferez, rand () devrait suffire pour tout nombre aléatoire dont vous aurez besoin.

Consultez également les générateurs congruentiels linéaires, cela pourrait être plus ce que vous recherchez si vous voulez les détails sales: http://en.wikipedia.org/wiki/Linear_congruential_generator

J'espère que cela t'aides!


7
Comment les actes godseraient-ils aléatoires dans le moindre bit? De plus, la foudre n'est pas aléatoire non plus, elle suit un chemin déterminé par diverses conditions. De plus, l'interpréteur qui génère le nombre est essentiellement hors de propos.

7
J'utilise les actes de Dieu au sens juridique: en.wikipedia.org/wiki/Act_of_God Ils sont considérés comme aléatoires car ils échappent au contrôle humain apparent.

4
Donc, essentiellement, il n'y a rien d'aléatoire. Mais cela nécessiterait que chaque occurrence apparemment aléatoire soit influencée, ce qui ne fonctionne pas lorsque vous arrivez au tout début du temps ... On dirait que je vais prendre des cours de philosophie = D

6
@Korvin, à notre connaissance, les phénomènes quantiques comme la désintégration radioactive ou l'émission d'un photon par un atome excité sont vraiment aléatoires. Cependant, les mathématiciens et les philosophes soutiennent ce que signifie être véritablement aléatoire. Et tandis que les gens ordinaires pensent qu'un tirage au sort est assez aléatoire, les magiciens de scène agiles ( news.stanford.edu/pr/2004/diaconis-69.html ) peuvent régulièrement obtenir 10 têtes sur 10 flips.
Charles E. Grant,

1
@Charles - Un tirage au sort n'est même pas une tête / queue binaire, c'est en fait une tête / queue / bord, donc un très bon magicien de scène pourrait le faire descendre sans tête ni queue. * 8 ')
Mark Booth

18

Ils ne sont généralement pas vraiment aléatoires, mais sont appelés pseudo-aléatoires car ils génèrent une séquence de nombres qui semble aléatoire. Cela se fait avec des formules mathématiques intéressantes. L'un des plus courants est le générateur linéaire congruentiel .

Les nombres pseudo-aléatoires ont une propriété utile que les vrais nombres aléatoires n'ont pas: si vous utilisez la même graine lorsque vous commencez, vous obtiendrez une séquence identique. Cela peut être très pratique pour les tests.


Si je comprends bien votre deuxième affirmation: random(5332)sera toujours égal à random(5332)?

2
@Korvin, non, je veux dire que si vous appelez, srand(5332)le prochain numéro renvoyé par randsera toujours le même.
Mark Ransom,

3
"semble aléatoire" -> ont les mêmes propriétés statistiques que les nombres vraiment aléatoires.

+1 pour le lien Wikipédia de LGC, cela présente une excellente animation de la raison pour laquelle les PRNG simples ont de sérieuses limites lors des simulations Monte-Carlo multidimensionnelles.
Mark Booth,

4

Demandez-vous pseudo-aléatoire ou aléatoire? D'autres ont répondu sur le pseudo-aléatoire, permettez-moi de parler de aléatoire.

Il y avait (sont?) De véritables générateurs de nombres aléatoires basés sur le matériel en vente. Ils étaient basés sur une puce avec une petite radio mesurant le bruit blanc du rayonnement de l'espace lointain, ou un petit échantillon radioactif et mesurant les périodes entre sa désintégration. Le problème avec eux était la bande passante - la quantité d'entropie qu'ils pouvaient générer n'était pas très élevée, ils ont donc été utilisés pour des germes d'algorithmes pseudo-aléatoires. Ils étaient utilisés dans les systèmes bancaires, la haute sécurité et autres.

OTOH, si vous rencontrez des développeurs de systèmes embarqués, ils en riront. À des fins courantes dans la programmation d'un microcontrôleur, la lecture de 4 bits bas de n'importe quel convertisseur analogique-numérique 16 bits avec une broche flottante (non connectée) produira un bruit aléatoire parfaitement bon, à une bande passante plus que suffisante (plus la période d'interrogation est courte, plus " bruyant "la lecture), et plus facile que d'écrire la routine RNG réelle. Et étant donné que les ADC se trouvent généralement implémentés dans le silicium des microcontrôleurs, généralement implémentés et souvent implémentés avec 8 canaux dont vous avez peut-être besoin de 5 pour votre application, c'est pratiquement gratuit.

Et même si vous n'avez pas d'ADC, quelques éléments connectés à une broche GPIO numérique produiront un très bon bruit. En mode embarqué, le bruit est omniprésent (et constamment combattu), et il est donc très facile d'obtenir un véritable caractère aléatoire.


2

Il existe de nombreuses façons d'essayer d'émuler une séquence de nombres "aléatoire". Votre premier arrêt devrait être de lire à propos des générateurs congruentiels linéaires , c'est sûr. C'est ainsi que fonctionnent la plupart des générateurs de nombres aléatoires de base, et je parie que c'est ainsi que fonctionne la fonction rand () de PHP.

La question suivante la plus intéressante à méditer est la suivante: comment se produit-elle? temps? Adresse IP? etc.


La graine est ce qui me déroute, je ne peux penser à rien qui puisse éventuellement semer la fonction sans une sorte de modèle, et même si ce n'est pas le cas, alors qu'est-ce qui provoque la génération aléatoire de la graine en premier lieu!

3
Je crois qu'un horodatage est souvent utilisé comme graine initiale alors qu'aucun n'est réellement fourni par une autre source. Dans l'ancien BASIC, RANDOMIZE TIMERétait un idiome commun, et "assez bon" pour la plupart des fins (non cryptographiques). Selon man 3 srand , la bibliothèque GNU C utilise une valeur fixe de 1 jusqu'à ce que le PRNG soit réensemencé.
un CVn le

1

Tout d'abord, pratiquement toutes les rand()fonctions ne fournissent pas de véritable caractère aléatoire, elles fournissent plutôt des soi-disant nombres pseudo-aléatoires.

Alors, comment fonctionnent les générateurs de nombres pseudo-aléatoires? Fondamentalement, de la même manière que le cryptage fonctionne: vous avez une fonction (un hachage) qui prend une entrée et produit une sortie d'une manière si complexe qu'il est impossible à la sortie de deviner l'entrée ou vice versa. Autrement dit, chaque chiffre peut être utilisé pour créer un générateur pseudo-aléatoire plutôt bon. Cependant, bien que vous puissiez utiliser n'importe quel générateur pseudo-aléatoire pour effectuer le chiffrement en principe, la plupart des générateurs de nombres pseudo-aléatoires sont principalement développés pour la vitesse, et non pour la sécurité cryptographique, de sorte qu'ils ne donneront aucun mal de tête aux pirates.

Pour un générateur pseudo-aléatoire, la fonction de hachage est appliquée à un état interne caché du générateur et sa sortie est utilisée pour a) modifier cet état interne et b) pour calculer la sortie de la rand()fonction. La prochaine invocation de rand()utilisera cet état interne modifié et produira ainsi un résultat différent. Plus la fonction de hachage est bonne, moins les résultats se distinguent facilement des vrais nombres aléatoires.


En fait, les ordinateurs ont aujourd'hui accès à de vrais nombres aléatoires: ils proviennent de la gigue dans le timing des interruptions produites par les appareils externes. Linux utilise ces valeurs de faible incertitude pour remuer constamment un "pool d'entropie", qui n'est que de quelques kilo-octets d'état interne. Les hachages cryptographiques basés sur ce pool d'entropie sont disponibles via les appareils /dev/randomet /dev/urandom. Ainsi, l'accès à de très bons nombres aléatoires est aussi simple que d'ouvrir l'un de ces deux appareils et d'en lire quelques octets.


-2

Les nombres aléatoires sont des nombres générés par le processus dont la sortie est imprévisible. c'est à dire que nous ne pouvons pas dire ce qui va être la prochaine sortie. Nous pouvons prendre un exemple simple de résultat des dés. Ce qui va sortir lorsque nous lançons un dé est imprévisible.

Il existe deux types de nombres aléatoires 1. Vrais nombres aléatoires 2. Nombres pseudo-aléatoires.

Comment les nombres aléatoires sont générés


1
Veuillez utiliser la mise en forme des citations pour mettre en évidence les parties de la réponse qui vous appartiennent et celles qui proviennent de la source que vous citez. Si toute votre réponse est un copier / coller à partir d'une source externe, ce n'est pas une bonne réponse ici.
Mat

cela ne semble pas offrir quoi que ce soit de substantiel par rapport aux points soulevés et expliqués dans les 6 réponses précédentes
gnat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.