web-dev-qa-db-fra.com

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

Je soupçonne que la réponse est ' À cause des mathématiques ', mais j'espérais que quelqu'un pourrait donner un peu plus d'informations à un niveau de base .. .

Je fouillais dans le code source BCL aujourd'hui, jetant un œil à la façon dont certaines des classes que j'ai utilisées auparavant ont été réellement implémentées. Je n'avais jamais pensé à comment générer des nombres (pseudo) aléatoires auparavant, alors j'ai décidé de voir comment cela se faisait.

Source complète ici: http://referencesource.Microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

Cette valeur MSEED est utilisée chaque fois qu'une classe Random () est amorcée.

Quoi qu'il en soit, j'ai vu ce "nombre magique" - 161803398 - et je n'ai pas la moindre idée de la raison pour laquelle ce numéro a été sélectionné. Ce n'est pas un nombre premier ou une puissance de 2. Ce n'est pas à mi-chemin d'un nombre qui semblait plus significatif. Je l'ai regardé en binaire et hexadécimal, et bien, cela ressemblait à un nombre pour moi.

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

163
Rob P.

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

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

Plus d'informations sur le nombre d'or ici .

Et un vraiment bonne lecture pour le mathématicien occasionnel ici .

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

141

Ce nombre est tiré de nombre d'or 1,61803398 * 10 ^ 8 . Matt a donné une belle réponse quel est ce nombre, donc je vais juste expliquer un peu un algorithme.

Ce n'est pas un numéro spécial pour cet algorithme. L'algorithme est l'algorithme de Knuth soustractif générateur de nombres aléatoires et les principaux points de celui-ci sont:

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

Le générateur est basé sur la récursivité suivante: Xn = (Xn-55 - Xn-24) mod m, où n ≥ 0. Ceci est un cas partiel de générateur de Fibonacci décalé : Xn = (Xnew Jersey @ Xn-k) mod m, où 0 <k <j et @ est une opération binaire (soustraction, addition, xor).

Il existe plusieurs implémentations de ce générateur. Knuth propose une implémentation dans FORTRAN dans son livre. J'ai trouvé ce qui suit code , avec le commentaire suivant:

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

Selon Knuth, tout grand MBIG et tout petit (mais toujours grand) MSEED peuvent être substitués aux valeurs ci-dessus.

Un peu plus peut être trouvé ici Notez que ce n'est pas en fait un document de recherche (comme indiqué par Math), c'est juste une thèse de maîtrise.

Les gens en cryptographie aiment utiliser un nombre irrationnel (pi, e, sqrt(5)) car il y a une conjecture selon laquelle les chiffres de ces nombres apparaissent avec fréquence égale et ont donc une haute entropie . Vous pouvez trouver cette question connexe sur security stackexchange pour en savoir plus sur ces nombres. Voici une citation:

"Si les constantes sont choisies au hasard, alors avec une forte probabilité, aucun attaquant ne pourra la casser." Mais les cryptographes, étant un groupe paranoïaque, sont sceptiques quand quelqu'un dit: "Utilisons cet ensemble de constantes. Je les ai choisis au hasard, je le jure ." Donc, comme compromis, ils utiliseront des constantes comme, par exemple, l'expansion binaire de π. Bien que nous n'ayons plus l'avantage mathématique de les avoir choisis au hasard parmi un grand nombre de nombres, nous pouvons au moins être plus confiants qu'il n'y a pas eu de sabotage.

62
Salvador Dali