162 votes

161803398 est-il un numéro «spécial»? À l'intérieur de Math.Random ()

Je soupçonne que la réponse est"Parce que des Maths", mais j'espérais que quelqu'un pourrait donner un peu plus de perspicacité à un niveau de base...

J'ai été farfouillé dans la BCL code source, aujourd'hui, avoir un regard sur la façon dont certaines des classes que j'ai utilisé avant ont été effectivement mises en œuvre. Je n'avais jamais pensé à la façon de générer des (pseudo) aléatoire de numéros avant, j'ai donc décidé de voir comment c'était fait.

Source complet ici: http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

Cette MSEED valeur est utilisée chaque fois qu'un Random() de la classe est ensemencée.

De toute façon, j'ai vu ce "nombre magique" - 161803398 - et je n'ai pas la moindre idée de pourquoi ce nombre a été choisi. Ce n'est pas un nombre premier ou une puissance de 2. Ce n'est pas "à moitié" dans un numéro qui leur semblait le plus important. Je l'ai regardé en binaire et en hexadécimal et bien, il a juste regardé comme un numéro pour moi.

J'ai essayé de chercher le numéro dans Google, mais je n'ai rien trouvé.

141voto

Matt Johnson Points 33433

Non, mais c'est basé sur Phi (le nombre d'or").

161803398 = 1.61803398 * 10^8 ≈ φ * 10^8

Plus sur le nombre d'or ici.

Et une vraiment bonne lecture pour le casual mathématicien ici.

Et j'ai trouvé un document de recherche sur les générateurs de nombres aléatoires qui est d'accord avec cette affirmation. (Voir la page 53).

62voto

Salvador Dali Points 11667

Ce numéro est tiré de golden ratio 1.61803398 * 10^8. Matt a donné une belle réponse qu'est-ce que ce nombre, donc je vais juste expliquer un peu plus sur un algorithme.

Ce n'est pas un numéro spécial pour cet algorithme. L'algorithme de Knuth est soustractive générateur de nombre aléatoire de l'algorithme et les principaux points sont:

  • stocker une circulaire de la liste des 56 nombres aléatoires
  • l'initialisation du processus de remplissage de la liste, puis randomize ces valeurs avec un algorithme déterministe
  • deux indices sont conservés qui sont de 31 à part
  • nouveau nombre aléatoire est la différence des deux valeurs des deux indices
  • magasin nouveau nombre aléatoire dans la liste

Le générateur est basé sur la récursivité: Xn = (Xn-55 - Xn-24) mod m, où n &geq; 0. C'est une partielle cas de la traîne de Fibonacci générateur: Xn = (Xn-j @ Xn-k) mod m, où 0 < k < j et @ toute opération binaire (soustraction, addition, xor).

Il existe plusieurs implémentations de ce générateur. Knuth offre une mise en œuvre dans FORTRAN dans son livre. J'ai trouvé ce code, avec le commentaire suivant:

PARAMÈTRE (MBIG=1000000000,MSEED=161803398,MZ=0,FAC=1.E-9)

Selon de Knuth, toute grande MBIG, et toute petite (mais grande) MSEED peut être substitué pour les valeurs ci-dessus.

Un peu plus peut être trouvé ici Noter, que ce n'est pas réellement un document de recherche (comme indiqué par les Maths), c'est juste un maître de thèse de doctorat.

Les gens dans la cryptographie comme à une utilisation irrationnelle nombre (pi, e, sqrt(5)) parce qu'il n'y est une conjecture que les chiffres de ces numéros s'affiche avec la même fréquence, et donc ont une haute entropie. Vous pouvez trouver cette question liée à la sécurité stackexchange pour en savoir plus sur ces numéros. Voici une citation:

"Si les constantes sont choisis au hasard, puis, avec une haute probabilité, pas de attaquant sera en mesure de le casser." Mais les cryptographes, étant un paranoïaque, beaucoup sont sceptiques quand quelqu'un dit, "nous allons utiliser ce jeu de les constantes. Je les ai pris au hasard, je le jure." Afin de trouver un compromis, ils vont utiliser des constantes, comme, par exemple, le fichier binaire de l'expansion de π. Alors que nous n'ont plus la mathématique avantage d'avoir choisi au aléatoire de quelques grands la piscine de nombres, nous pouvons au moins être plus confiant, il n'y avait pas de sabotage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X