161803398 è un numero 'speciale'? Inside of Math.Random ()


162

Sospetto che la risposta sia " A causa della matematica ", ma speravo che qualcuno potesse dare un po 'più di comprensione a un livello base ...

Stavo frugando nel codice sorgente BCL oggi, guardando come alcune delle classi che ho usato prima erano effettivamente implementate. Non avevo mai pensato a come generare numeri (pseudo) casuali prima, quindi ho deciso di vedere come è stato fatto.

Fonte completa qui: http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

Questo valore MSEED viene utilizzato ogni volta che viene eseguita la seeding di una classe Random ().

Comunque, ho visto questo "numero magico" - 161803398 - e non ho la più pallida idea del perché quel numero sia stato selezionato. Non è un numero primo o una potenza di 2. Non è "a metà strada" per un numero che sembrava più significativo. L'ho guardato in binario ed esadecimale e beh, mi è sembrato solo un numero.

Ho provato a cercare il numero su Google, ma non ho trovato nulla.



6
@ 48klocs: lo dice nei documenti :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 Sì, pagina 283 qui: apps.nrbook.com/c/index.html La sua ragione sembra essere "perché la matematica".
eshs,

22
@eshs: Fatto interessante: la pagina 283 del tuo link mostra inextp = 31;, ma il codice sorgente della Randomclasse lo ha come se inextp = 21;qualcuno lo avesse digitato male causando questo errore .
Jesse Good,

7
@Izkata Dobbiamo educare gli utenti sul comportamento corretto (di non votare per chiudere erroneamente) per l'obiettivo a lungo termine della qualità del sito, non solo per l'obiettivo a breve termine (di non avere una domanda specifica chiusa). E se non ho sottolineato i commenti sopra, potrebbe essere stato chiuso come duplicato perché le persone lo fanno a volte.
Bernhard Barker,

Risposte:


141

No, ma si basa su Phi (il "rapporto aureo").

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

Maggiori informazioni sul rapporto aureo qui .

E una lettura davvero buona per il matematico occasionale qui .

E ho trovato un documento di ricerca sui generatori di numeri casuali che concorda con questa affermazione. (Vedi pagina 53.)


17
Sai perché un numero basato su Phi fa una buona scelta come seme? Sarebbe possibile riassumere questo qui?
Bernhard Barker,

29
@Dukeling La costante viene utilizzata esattamente una volta, per temperare il seme in arrivo. Il mio sospetto molto forte è che è stato scelto per essere un valore nullo nella manica che impedisce ai semi con pochi bit impostati (forse una scelta comune) di rovinare il generatore di numeri casuali (invece di alcune proprietà magiche del phi).
David Eisenstat,

7
Per citare una citazione dal suddetto libro Secondo Knuth qualsiasi MBIG di grandi dimensioni e qualsiasi MSEED più piccolo (ma comunque grande) possono essere sostituiti con i valori di cui sopra. Quindi è divertente matematicamente, più o meno .. Quindi la risposta corretta dovrebbe essere: No. Ma si basa su Phi.
Ho visto

14
Ho appena dato un'occhiata a quel documento a numero casuale - questa riga si è distinta un po '- "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(pagina 4)
jcw

2
Penserei che un modo più rilevante di usare il rapporto aureo sarebbe usare (modulo / phi) piuttosto che usare una rappresentazione in base 10 delle cifre nel codice che non ha nulla a che fare con la base 10. Una caratteristica interessante del phi che In quella pagina non ho visto che da quello che posso dire, per qualsiasi numero intero N, il valore N / phi-int (N / phi)> = 1 / N / sqrt (5). Ciò significherebbe che anche se si generasse una sequenza di numeri N / phi-int (N / phi), la distanza tra la coppia più vicina sarà entro un fattore di sqrt (5) della spaziatura uniforme più grande possibile nell'intervallo ( 0..1)
supercat,

62

Questo numero è preso da rapporto aureo 1.61803398 * 10 ^ 8 . Matt ha dato una bella risposta, che cos'è questo numero, quindi spiegherò solo un po 'di un algoritmo.

Questo non è un numero speciale per questo algoritmo. L'algoritmo è l'algoritmo sottrattivo del generatore di numeri casuali di Knuth e i suoi punti principali sono:

  • memorizzare un elenco circolare di 56 numeri casuali
  • l'inizializzazione è un processo di riempimento dell'elenco, quindi randomizza quei valori con uno specifico algoritmo deterministico
  • vengono mantenuti due indici che sono 31 a parte
  • nuovo numero casuale è la differenza dei due valori nei due indici
  • memorizzare un nuovo numero casuale nell'elenco

Il generatore si basa sulla seguente ricorsione: X n = (X n-55 - X n-24 ) mod m, dove n ≥ 0. Questo è un caso parziale di generatore di Fibonacci ritardato : X n = (X n-j @ X n-k ) mod m, dove 0 <k <j e @ è qualsiasi operazione binaria (sottrazione, addizione, xor).

Esistono diverse implementazioni di questo generatore. Knuth offre un'implementazione in FORTRAN nel suo libro. Ho trovato il seguente codice , con il seguente commento:

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

Secondo Knuth, qualsiasi MBIG di grandi dimensioni e qualsiasi MSEED più piccolo (ma comunque grande) può essere sostituito con i valori di cui sopra.

Un po 'di più può essere trovato qui Nota che questo non è in realtà un documento di ricerca (come affermato da Math), questa è solo una tesi di laurea magistrale.

Persone nella crittografia come utilizzare numero irrazionale ( pi, e, sqrt(5)) perché c'è una congettura che cifre di tali numeri appare con la stessa frequenza e quindi hanno alta entropia . Puoi trovare questa domanda correlata su security stackexchange per saperne di più su tali numeri. Ecco una citazione:

"Se le costanti sono scelte a caso, quindi con alta probabilità, nessun attaccante sarà in grado di romperlo." Ma i crittografi, essendo un lotto paranoico, sono scettici quando qualcuno dice: "Usiamo questo insieme di costanti. Li ho scelti a caso, lo giuro ." Quindi, come compromesso, useranno costanti come, diciamo, l'espansione binaria di π. Anche se non abbiamo più il vantaggio matematico di averli scelti a caso da un grande numero di numeri, possiamo almeno essere più sicuri che non ci sia stato un sabotaggio.


5
Per quanto riguarda la risposta, non è solo a causa della loro entropia, è anche perché quei numeri raddoppiano come niente nei miei numeri di manica .
Cole Johnson,
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.