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


162

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 ...

J'étais en train de fouiller dans le code source de BCL aujourd'hui, pour voir comment certaines des classes que j'ai utilisées auparavant étaient réellement implémentées. Je n'avais jamais pensé à générer des nombres (pseudo) aléatoires auparavant, j'ai donc 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 nombre 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 en 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é.



6
@ 48klocs: C'est dit dans la documentation :The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.
Jesse Good

4
@ 48klocs Oui, page 283 ici: apps.nrbook.com/c/index.html Sa raison semble être "parce que les maths".
eshs

22
@eshs: Fait intéressant: la page 283 de votre lien s'affiche inextp = 31;, mais le code source de la Randomclasse l'a comme inextp = 21;parce que quelqu'un l'a mal tapé à l'origine de ce bogue .
Jesse Good

7
@Izkata Nous devons éduquer les utilisateurs sur le comportement correct (de ne pas voter pour fermer par erreur) pour l'objectif à long terme de la qualité du site, pas seulement viser l'objectif à court terme (de ne pas avoir une question spécifique fermée). Et si je n'avais pas souligné les commentaires ci-dessus, cela aurait pu être fermé comme un doublon parce que les gens le font parfois.
Bernhard Barker

Réponses:


141

Non, mais il est basé sur Phi (le «nombre d'or»).

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

En savoir plus sur le nombre d'or ici .

Et une très bonne lecture pour le mathématicien occasionnel 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 page 53.)


17
Savez-vous pourquoi un nombre basé sur Phi est un bon choix comme graine? Serait-il possible de résumer cela ici?
Bernhard Barker

29
@Dukeling La constante est utilisée exactement une fois, pour tempérer la graine entrante. Mon très fort soupçon est qu'il a été choisi pour être un numéro de rien dans ma manche qui empêche les graines avec quelques bits définis (peut-être un choix commun) de bousiller le générateur de nombres aléatoires (au lieu d'une propriété magique de phi).
David Eisenstat

7
Pour citer une citation dudit livre Selon Knuth, tout grand MBIG et tout MSEED plus petit (mais toujours grand) peut être remplacé par les valeurs ci-dessus. C'est donc plus ou moins amusant mathématique. La bonne réponse devrait donc être: Non, mais elle est basée sur Phi.
TaW

14
Je viens de jeter un œil à ce papier à nombres aléatoires - cette ligne se démarque un peu - "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(page 4)
JCW

2
Je pense qu'une manière plus pertinente d'utiliser le nombre d'or serait d'utiliser (module / phi) plutôt que d'utiliser une représentation en base 10 des chiffres du code qui n'a rien à voir avec la base 10. Une caractéristique intéressante de phi qui Je n'ai pas vu sur cette page que d'après ce que je peux dire, pour tout entier N, la valeur N / phi-int (N / phi)> = 1 / N / sqrt (5). Cela signifierait que même si on générait une séquence de nombres N / phi-int (N / phi), la distance entre la paire la plus proche sera dans un facteur de sqrt (5) du plus grand espacement uniforme possible dans l'intervalle ( 0..1)
supercat

62

Ce nombre est tiré du nombre d' or 1.61803398 * 10 ^ 8 . Matt a donné une belle réponse à propos de 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 générateur de nombres aléatoires soustractif de Knuth et ses principaux points sont:

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

Le générateur est basé sur la récursivité suivante: X n = (X n-55 - X n-24 ) mod m, où n ≥ 0. Il s'agit d'un cas partiel de générateur de Fibonacci retardé : X n = (X n-j @ X n-k ) mod m, où 0 <k <j et @ est toute opération binaire (soustraction, addition, xor).

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

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

Selon Knuth, tout grand MBIG et tout MSEED plus petit (mais toujours grand) peut être remplacé par les 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 dans la cryptographie à utiliser comme nombre irrationnel ( pi, e, sqrt(5)) parce qu'il ya une conjecture que les chiffres de ces chiffres apparaît avec une fréquence égale et ont donc forte entropie . Vous pouvez trouver cette question connexe sur security stackexchange pour en savoir plus sur ces nombres. Voici un devis:

"Si les constantes sont choisies au hasard, alors avec une forte probabilité, aucun attaquant ne pourra les casser." Mais les cryptographes, étant paranoïaques, sont sceptiques quand quelqu'un dit: "Utilisons cet ensemble de constantes. Je les ai choisies 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 sûrs qu'il n'y a pas eu de sabotage.


5
En ce qui concerne le répondeur, ce n'est pas seulement à cause de leur entropie, c'est aussi parce que ces chiffres ne font rien dans ma manche .
Cole Johnson
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.