Fonte originale dell'algoritmo casuale `(seed * 9301 + 49297)% 233280`?


9

Se cerchi esempi di creazione di un generatore di numeri casuali seeded (pseudo), ti imbatterai in cose come questa (esempio specifico 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);
}

Quei numeri specifici (9301, 49297, 233280) e l'algoritmo vengono usati più e più volte, ma nessuno sembra avere un riferimento definitivo per questo. Chi ha inventato questo algoritmo e testato la distribuzione? C'è un foglio o qualcosa da citare?


5
è un generatore di congruenza lineare ma con un periodo abbastanza piccolo (solo 233k mentre un int a 32 bit consente un periodo di 4 miliardi
maniaco del cricchetto

1
Le persone spesso copiano il codice direttamente dai libri, quindi probabilmente da un vecchio libro da qualche parte ed è stato copiato più volte. Sembra anche essere un caso limitante. Forse utile: heydari.persiangig.com/Ebooks/Applied_Crypto-Ch11-ch20.pdf/… ict.griffith.edu.au/anthony/info/C/RandomNumbers
barrycarter

2
Qualunque sia l'origine, questi sono valori terribili da usare per calcolare un seme.

3
@jlarson un commento non è abbastanza lungo, ma ci sono due problemi a portata di mano. In primo luogo, come alluso del maniaco del cricchetto, il modulo è il periodo massimo : numero di numeri univoci prima che il generatore si ripeta. Il periodo effettivo potrebbe essere inferiore. In secondo luogo, gli altri due numeri (principalmente il multiplicando) dovrebbero essere relativamente primi al numero del modulo per garantire un periodo più lungo. Idealmente il numero del modulo è il primo più grande in meno del numero intero massimo positivo che si adatta al tipo di dati, e anche gli altri due numeri sono numeri primi grandi.

1
Questa è la versione breve e corta del motivo per cui quei numeri sono terribili, dato che questa è una discussione laterale e l'aggiunta di una risposta effettiva non è appropriata per questa domanda. Consiglio di rimbalzare su Wikipedia e forse Matematica o Informatica per maggiori informazioni, anche se gli algoritmi numerici tecnicamente pseudocasuali sono anche in argomento su Programmers.

Risposte:


7

Una rapida ricerca di Google Libri mostra che questi numeri (9301, 49297, 233280) sono stati utilizzati in numerosi riferimenti:

  • Ricette numeriche in FORTRAN 77
  • Un'introduzione ai metodi numerici in C ++
  • Risorsa per sviluppatori CGI: programmazione Web in TCL e PERL
  • Fortran 77 efficace per ingegneri e scienziati
  • Sviluppo JavaScript
  • Tutto su C
  • Esempi Java in breve
  • Algoritmi seminumerici
  • Un'introduzione alla meccanica

Il più antico è il Metodo informatico del 1977 per i calcoli matematici di George Elmer Forsythe, Michael A. Malcolm, Cleve B. Moler (Prentice-Hall), sebbene Google non mostri dove sia stato usato il testo nel libro, quindi non può essere verificato.

Il primo che mostra il testo è Ricette numeriche in Pascal (Prima edizione): The Art of Scientific Computing , Volume 1 di Press, Teukolsky, Vetterling e Flannery in una tabella a tutta pagina di "Costanti per generatori di numeri casuali portatili". Questi numeri particolari vengono dati con un overflow a 2 ^ 31.

La serie di libri di ricette numeriche è estremamente popolare e è stata stampata dal 1986.


1
Caspita, se la risposta non è qui non so dove sarebbe. Grazie .. // Speravo in qualche modo di poter indicare alcune ricerche specifiche sul perché questi numeri sono speciali, ma questo è sufficiente. 9301 è un prodotto di due numeri primi (71x131), 49297 è un numero primo - istintivamente ritengo che debba essere rilevante. 233280 non è un numero primo - equivale a 2x2x2x2x2x2x3x3x3x3x3x3x5 (o 2 ^ 6 * 3 ^ 5 * 5)
jlarson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.