Je réfléchissais juste à la fonction php rand(), et je réfléchissais à comment je pourrais la refaire, et je suis venu complètement stupéfait.

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

Commentaires

  • Les générateurs pseudo-aléatoires utilisent une graine, un tableau des constantes prédéfinies et des formules mathématiques. Les générateurs de nombres aléatoires réels utilisent généralement le bruit atmosphérique. Vous pouvez facilement obtenir des nombres aléatoires en lisant / dev / random.
  • Le bruit atmosphérique est-il garanti aléatoire?
  • random.org a un assez bonne discussion sur les nombres aléatoires et comment ils ‘ sont générés .
  • function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
  • Quelquun doit faire ceci: xkcd.com/221 😉

Réponse

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 des actes de Dieu, comme la foudre.

Cet article de wikipedia pourra peut-être vous aider dans lexplication: http://en.wikipedia.org/wiki/Random_number_generators


Daprès ce que je comprends, il y a essentiellement deux parties dun RNG: la graine, puis le nombre aléatoire choisi à partir de cette graine. Lorsque vous amorcez le RNG, vous donnez cest léquivalent dun po de départ int. Ce point de départ a alors un tas de nombres qui sont « à lintérieur » de celui-ci 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 aller dans la graine et choisir un nombre entre le min et le max, inclus.


AVERTISSEMENT, ANALOGIE DE 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 glaçons. À la foire du comté, ils choisiront une glacière à utiliser pour les boissons, et ils ne pourront utiliser quun seul glaçon. Cependant, ils nont besoin que de glaçons de plus de 1 pouce cube. Ainsi, ils choisiront un coffre au hasard entre ces 1000 coffres, puis ils choisiront un glaçon à lintérieur de ce coffre au hasard. Si cela fonctionne pour la taille souhaitée, ils lutilisent. Si ce nest pas le cas, ils le remettent dans le coffre avec les autres. Sils veulent le rendre un peu plus amusant, ils changent de coffre au préalable pour une totale inconscience, si vous voulez!

Quant à savoir comment PHP choisit physiquement la graine et le nombre aléatoire, je nai pas assez de connaissances pour cela (ce qui est probablement ce que vous vous posez le plus!). Je nessaierais pas de refaire la fonction rand (); pour la plupart des applications Web que vous allez créer, rand () devrait suffire pour tout nombre aléatoire dont vous aurez besoin.

Vérifiez également la congruence linéaire générateurs, cela pourrait être plus de ce que vous « recherchez si vous voulez les détails sales: http://en.wikipedia.org/wiki/Linear_congruential_generator

Jespère que cela vous aidera!

Commentaires

  • Comment les actes de god seraient-ils aléatoires dans le moindre détail? En plus de cela, la foudre nest pas ‘ t aléatoire non plus, elle suit un chemin déterminé par diverses conditions. De plus, l’interprète qui génère le nombre n’a pratiquement pas d’importance.
  • Je ‘ m en utilisant des 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.
  • Donc, essentiellement, il ny a rien qui soit aléatoire. Mais cela exigerait que chaque occurrence apparemment aléatoire soit influencée, ce qui ne ‘ t que lorsque vous arrivez au tout début des temps … On dirait que je ‘ je vais suivre des cours de philosophie = D
  • @Korvin, pour autant que nous le sachions, les phénomènes quantiques comme la désintégration radioactive ou lémission dun photon par un atome excité sont vraiment aléatoires . Cependant, les mathématiciens et les philosophes expliquent ce que signifie être véritablement aléatoire. Et tandis que les gens ordinaires pensent quun 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 obtenez 10 têtes sur 10 flips.
  • @Charles – Un tirage au sort nest pas ‘ t même un binaire têtes / queues, cest ‘ est en fait heads / tails / edge, donc un très bon magicien de scène pourrait le faire descendre ni tête ni queue. * 8 ‘)

Réponse

Ils « 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. Ceci est fait avec quelques formules mathématiques intéressantes. Lune des plus courantes est le Congruentiel linéaire Générateur .

Les nombres pseudo-aléatoires ont une propriété utile que les vrais nombres aléatoires nont 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.

Commentaires

  • Si ‘ je comprends correctement votre deuxième déclaration: random(5332) sera toujours égal à random(5332)?
  • @Korvin, non je veux dire si vous appelez srand(5332) alors le numéro suivant renvoyé par rand sera toujours le même.
  •  » semble aléatoire  » – > ont les mêmes propriétés statistiques que les nombres vraiment aléatoires.
  • +1 pour le lien LGC Wikipédia, il a un excellent animation expliquant pourquoi les PRNG simples ont de sérieuses limitations lors des simulations multidimensionnelles de Monte-carlo.

Réponse

Est-ce que oui Vous demandez Pseudo-Aléatoire ou Aléatoire? Dautres ont répondu à propos du pseudo-aléatoire, laissez-moi parler de Random.

Il y avait (sont?) De réels 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 lespace 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é dentropie quils pouvaient générer nétait pas très élevée, ils étaient donc utilisés pour les graines dalgorithmes pseudo-aléatoires. Ils étaient utilisés dans les systèmes bancaires, à haute sécurité, etc.

OTOH, si vous rencontrez des développeurs de systèmes embarqués, ils se moqueront de ceux-ci. Pour des raisons courantes de programmation dun microcontrôleur, la lecture de 4 bits bas de nimporte quel convertisseur analogique-numérique 16 bits avec une broche flottante (non connectée) produira un très bon bruit aléatoire, à une bande passante plus que suffisante (plus la période dinterrogation est courte, plus la lecture est « bruyante ») et plus facile que lécriture de la routine RNG réelle. Et étant donné que les ADC sont généralement mis en œuvre dans le silicium des microcontrôleurs, couramment mis en œuvre et souvent mis en œuvre avec 8 canaux dont vous avez peut-être besoin de 5 pour votre application, cest pratiquement gratuit.

Et même si vous ne disposez pas dun ADC, quelques éléments connectés à une broche GPIO numérique produiront un très bon bruit. Dans le domaine intégré, le bruit est ev euh-présent (et constamment combattu), et donc obtenir un vrai hasard est très facile.

Réponse

Il y a plusieurs façons pour tenter démuler une séquence « aléatoire » de nombres. Votre premier arrêt devrait être de lire sur les générateurs congruentiels linéaires , bien sûr. Cest ainsi que fonctionnent la plupart des générateurs de nombres aléatoires basiques, et je parie que cest ainsi que fonctionne la fonction rand () de PHP.

La prochaine question la plus intéressante à se poser est de savoir comment se déclenche-t-elle? ? Adresse IP? Etc.

Commentaires

  • La graine est ce qui me déroute, je peux ‘ Je ne pense pas à tout ce qui peut éventuellement semer la fonction sans une sorte de modèle, et même si ce nest pas le cas, alors quest-ce qui cause la génération de la graine aléatoire en premier lieu!
  • Je crois quun horodatage est souvent utilisé comme valeur de départ lorsque aucun nest fourni par une autre source. Dans lancien BASIC, RANDOMIZE TIMER était un idiome courant, et  » bien assez  » pour la plupart des objectifs (non cryptographiques). Selon man 3 srand , la bibliothèque GNU C utilise un fixe de 1 jusquà ce que le PRNG soit réensemencé.

Réponse

Tout dabord, pratiquement tous rand() ne fournissent pas un vrai caractère aléatoire, mais plutôt des nombres dits pseudo-aléatoires.

Alors, comment fonctionnent les générateurs de nombres pseudo-aléatoires? Fondamentalement, de la même manière que le chiffrement fonctionne: vous avez une fonction (un hachage) qui prend une entrée et produit une sortie dune manière si complexe quil est impossible à partir de la sortie de deviner lentrée ou vice versa. chaque chiffrement peut être utilisé pour créer un assez bon générateur pseudo-aléatoire. Cependant, bien que vous puissiez utiliser nimporte quel générateur pseudo-aléatoire pour faire du chiffrement en principe, la plupart des générateurs de nombres pseudo-aléatoires sont principalement développés pour la vitesse, pas la sécurité cryptographique, donc ils ne donnera pas de maux 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 fonction rand(). 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 de nos jours ont accès à des nombres aléatoires réels: ils proviennent de la gigue dans la synchronisation des interruptions produites par des périphériques externes. Linux utilise ces valeurs de faible incertitude pour constamment agiter un « pool dentropie », qui ne représente que quelques kilo-octets détat interne. Les hachages cryptographiques basés sur ce pool dentropie sont rendus disponibles via les appareils /dev/random et /dev/urandom. Ainsi, accéder à de très bons nombres aléatoires est aussi simple que douvrir lun de ces deux appareils et den lire quelques octets.

Réponse

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

Il existe deux types de nombres aléatoires 1. Les vrais nombres aléatoires 2. Les pseudo nombres aléatoires.

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

Commentaires

  • Veuillez utiliser la mise en forme des guillemets pour mettre en évidence les parties du les réponses sont les vôtres et qui proviennent de la source que vous citez. Si votre réponse est uniquement un copier / coller dune source externe, ‘ nest pas une bonne réponse ici.
  • cela ne ‘ t semble offrir quoi que ce soit de substantiel sur les points soulevés et expliqués dans les 6 réponses précédentes

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *