Source d'origine de l'algorithme aléatoire `(graine * 9301 + 49297)% 233280`?


9

Si vous recherchez des exemples de création d'un générateur de nombres aléatoires (pseudo) prédéfini, vous rencontrerez des choses comme celle-ci (exemple spécifique http://indiegamr.com/generate-repeatable-random-numbers-in-js/ ):

// the initial seed
Math.seed = 6;

// in order to work 'Math.seed' must NOT be undefined,
// so in any case, you HAVE to provide a Math.seed
Math.seededRandom = function(max, min) {
    max = max || 1;
    min = min || 0;

    Math.seed = (Math.seed * 9301 + 49297) % 233280;
    var rnd = Math.seed / 233280;

    return min + rnd * (max - min);
}

Ces nombres spécifiques (9301, 49297, 233280) et algorithme sont utilisés maintes et maintes fois, mais personne ne semble avoir de référence définitive pour cela. Qui a inventé cet algorithme et testé la distribution? Y a-t-il un papier ou quelque chose à citer?


5
c'est un générateur linéaire congru mais avec une période assez petite (seulement 233k alors qu'un int 32 bits permet d'avoir une période de 4 milliards
ratchet freak

1
Les gens copient souvent du code directement à partir de livres, il s'agit donc probablement d'un vieux livre quelque part et a été copié plusieurs fois. Cela semble également être un cas limitatif. Peut-être utile: heydari.persiangig.com/Ebooks/Applied_Crypto-Ch11-ch20.pdf/… ict.griffith.edu.au/anthony/info/C/RandomNumbers
barrycarter

2
Quelle que soit l'origine, ce sont des valeurs terribles à utiliser pour calculer une graine.

3
@jlarson un commentaire n'est pas assez long, mais il y a deux problèmes à résoudre. Tout d'abord, comme le fait allusion à un cliquet, le modulo est la période maximale : nombre de nombres uniques avant que le générateur ne se répète. La période réelle peut être plus courte. Deuxièmement, les deux autres nombres (principalement le multiplicande) devraient être relativement premiers au nombre modulo pour assurer une période plus longue. Idéalement, le nombre modulo est le plus grand nombre premier inférieur au nombre entier positif maximal qui tient dans le type de données, et les deux autres nombres sont également de grands nombres premiers.

1
C'est la version courte et courte des raisons pour lesquelles ces chiffres sont terribles, étant donné qu'il s'agit d'une discussion parallèle et l'ajout d'une réponse réelle n'est pas approprié pour cette question. Je recommande de rebondir autour de Wikipedia et peut-être des mathématiques ou de l' informatique pour plus d'informations, bien que les algorithmes de nombres techniquement pseudo-aléatoires soient également sur le sujet chez les programmeurs.

Réponses:


7

Une recherche rapide dans Google Livres montre que ces numéros (9301, 49297, 233280) ont été utilisés dans un certain nombre de références:

  • Recettes numériques dans FORTRAN 77
  • Une introduction aux méthodes numériques en C ++
  • Ressource du développeur CGI: Programmation Web en TCL et PERL
  • Fortran 77 efficace pour les ingénieurs et les scientifiques
  • Développement JavaScript
  • Tout sur C
  • Exemples Java en bref
  • Algorithmes semi-numériques
  • Une introduction à la mécanique

La plus ancienne est les méthodes informatiques de 1977 pour les calculs mathématiques de George Elmer Forsythe, Michael A. Malcolm, Cleve B. Moler (Prentice-Hall), bien que Google ne montre pas où le texte a été utilisé dans le livre, il ne peut donc pas être vérifié.

La première représentation du texte est Recettes numériques en Pascal (première édition): L'art du calcul scientifique , volume 1 par Press, Teukolsky, Vetterling et Flannery dans un tableau pleine page de "Constantes pour les générateurs de nombres aléatoires portables". Ces nombres particuliers sont donnés avec un débordement à 2 ^ 31.

La série de livres sur les recettes numériques est très populaire et est imprimée depuis 1986.


1
Wow, si la réponse n'est pas là, je ne sais pas où elle serait. Merci .. // J'espérais en quelque sorte être en mesure d'indiquer des recherches spécifiques sur la raison pour laquelle ces chiffres sont spéciaux, mais cela suffit. 9301 est un produit de deux nombres premiers (71x131), 49297 est un nombre premier - instinctivement, je pense que cela doit être pertinent. 233280 n'est pas un nombre premier - il est égal à 2x2x2x2x2x2x3x3x3x3x3x3x5 (ou 2 ^ 6 * 3 ^ 5 * 5)
jlarson
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.