Fortuna o Mersenne Twister è preferibile come RNG algoritmico?


19

Una recente risposta ha menzionato l'uso dei generatori di numeri casuali ( RNG ) di Fortuna o Mersenne Twister per seminare una simulazione Monte Carlo . Non avevo mai sentito parlare di Fortuna prima, quindi l'ho cercato - sembra che sia principalmente destinato all'uso crittografico.

Attualmente uso un Mersenne Twister nel codice di produzione per seminare un algoritmo K-Means.

Quale (Fortuna o Mersenne Twister) è considerato il migliore per le applicazioni di "seeding algoritmico" (ad es. Seeding Monte Carlo e K-Means)? O è un "lancio", ovvero usa il più conveniente.

Da dove sono seduto, "best" dovrebbe fornire numeri casuali della massima qualità, operare rapidamente e (possibilmente) avere un ingombro di memoria ridotto. Di questi, la qualità è probabilmente la più importante per la maggior parte di noi.


6
I PRNG crittografici tendono ad essere molto più lenti della maggior parte degli altri PRNG; se stai eseguendo una simulazione Monte Carlo in cui il numero di operazioni del PRNG è in milioni, i metodi crittografici saranno terribilmente costosi.
JM,

1
@JM - Con un po 'più di dettaglio, penso che il tuo commento sarebbe buono come risposta. Sarebbe sicuramente interessante vedere se la moderna funzionalità di crittografia con accelerazione hardware potrebbe essere utilizzata per creare un flusso ad alte prestazioni di numeri pseudo casuali crittograficamente sicuri.
Mark Booth,

@JM buon punto sul fatto che i GNL crittografici sono lenti - segna contro Fortuna
vinto il

ecco un buon elenco di PRNG e molte statistiche diverse che potresti trovare utili speranze che possano
pyCthon,

Il mio problema con cstdlib era la granularità - solo RAND_MAX=32768valori possibili. Attualmente sto usando MT per il simulatore di raytracing di Monte Carlo. Tuttavia, non vedo MT come un collo di bottiglia nelle prestazioni nel mio profiler, probabilmente perché sto facendo una generazione "casuale" di cose come le direzioni dei raggi come un processo preliminare . Ad esempio, potrei generare una matrice di 100.000 raggi all'avvio, memorizzarli in una matrice e selezionare in modo casuale la posizione iniziale della matrice in fase di esecuzione (in esecuzione per circa 10.000 raggi della raccolta). Questo ha un sovraccarico di memoria relativamente elevato, in cambio di buone distribuzioni di numeri casuali.
bobobobo,

Risposte:


14

Bene, tutto è un compromesso di un qualche tipo. Per i generatori di numeri casuali, li raggruppo in 3 categorie di base:

  1. Abbastanza buono per i compiti.
  2. Abbastanza buono su cui scommettere la tua azienda.
  3. Abbastanza buono su cui scommettere il tuo paese.

I PRNG congruenziali lineari (il metodo generalmente implementato nella maggior parte delle biblioteche) fanno parte della categoria 1. Sia Fortuna che Mersenne Twister fanno parte della categoria 2.

Per un articolo interessante su come incasinare un algoritmo di mescolamento può costare la tua azienda / casinò, ti consiglio questo del 1999 . A causa del marciume del collegamento, le immagini sono sparite, ma la figura 4, quella in cui traccia il numero successivo dal PRNG rispetto al numero precedente generato, è un insieme di linee parallele.

Come sottolinea JM, Fortuna è lenta. Come hai sottolineato, Mersenne Twister è ragionevolmente veloce.


2
Scorrendo rapidamente la versione stampabile dell'articolo , "figura 4" sembra essere un codice anziché un'immagine. "Figura 5" sembra kaput, ma questa è l'immagine che ho ottenuto dalla WayBack Machine .
JM,

Grazie. sembra che la velocità sia un segno contro Fortuna in questo caso. Ri. Mescolate male: sì, ne so abbastanza (non molto!) Che è facile "annullare" la casualità di un RNG - per esempio, scegliendo un seme iniziale male.
vinto il

Un'altra versione con immagini migliori è disponibile su: cigital.com/papers/download/developer_gambling.php
Tangurena

1
I LCG a 96 bit con uscite a 32 bit superano più test statistici rispetto a Mersenne Twisters. Nessuno dovrebbe usare un Mersenne Twister al giorno d'oggi, dato che è così facile realizzare PRNG non crittografici decenti che sono di gran lunga migliori della MT in ogni senso significativo.
Veedrac,

4

La scelta predefinita nella categoria "crittografica" è Blum-Blum-Shub , credo. Come già indicato nella pagina di Wikipedia, questo non è adatto per le simulazioni perché è troppo lento.

Se stai eseguendo un sistema simile a unix, potresti anche prendere in considerazione l'idea di ottenere i tuoi numeri casuali direttamente da / dev / urandom , il servizio del sistema operativo che fornisce numeri casuali di buona qualità (anche se non necessariamente criptati). A seconda del sistema operativo in uso, questo potrebbe utilizzare l'algoritmo Yarrow, di cui Fortuna è una variante. Ma l'aspetto più interessante è che il sistema operativo ha accesso ad alcuni numeri casuali reali: il rumore termico proveniente dai sensori di temperatura interni, ad esempio. In genere, questi dati vengono mescolati nel pool casuale ogni volta che diventano disponibili per mantenere imprevedibili i dati.

Questo concetto di miscelazione nella casualità suggerisce che potrebbe essere possibile ottenere il meglio da entrambi i mondi come segue. Usa un generatore di numeri casuali più veloce e di buona qualità come Mersenne come RNG di base. Mantenere anche un secondo generatore di numeri casuali di migliore qualità, ad esempio Fortuna. Ogni tanti numeri, diciamo 25, eseguono un'iterazione del RNG migliore e aggiungono il risultato allo stato del tuo RNG di base. In questo modo otterresti prestazioni abbastanza elevate e risultati di qualità abbastanza elevata. (Immagino che sarebbe inutile per la crittografia, perché la forza di questo generatore composito potrebbe essere la forza del collegamento più debole. Ma per le simulazioni, in cui in genere non si ha un avversario dannoso, potrebbe funzionare.)


/ dev / urandom è sicuro da usare per la crittografia su linux e free-bsd. Guarda questa risposta
Adam Kurkiewicz,

Per le simulazioni, perché sarebbe una caratteristica desiderabile che i numeri casuali fossero veri? Certo, alcuni generatori di numeri pseudo-casuali sono peggio, ma altri saranno alla pari per tutti gli scopi pratici. Quindi, perché consideri la verità come una buona caratteristica in sé?
Wrzlprmft,

2

Volevo intervenire per dire che, recentemente ho attraversato questo processo con una simulazione e dovrei notare che l'uso di Fortuna non è fuori discussione se è davvero necessario. Nel nostro caso, eravamo preoccupati che l'entropia di MT non fosse abbastanza elevata da tradursi in una parzialità nella nostra simulazione. Quindi per la nostra simulazione abbiamo usato Fortuna estraendo circa 65 miliardi di numeri casuali da quell'algo. Il punto è che i computer sono veloci, se ne hai davvero bisogno puoi usarlo se hai un motivo. Se stai semplicemente facendo qualcosa di simile a un'integrazione Monte Carlo, segui MT.


0

Penso che la risposta dipenda molto dall'applicazione per cui intendi utilizzare l'RNG. Suggerirei una quarta categoria per la classificazione approssimativa di Tangurena: "Buono senza alcun guadagno reale".

Per molte applicazioni, potrebbe semplicemente non avere importanza e un RNG adeguatamente crittografato può semplicemente rallentare le attività senza alcun guadagno proporzionale nella validità. Ad esempio, gran parte della ricerca che faccio richiede solo molti, molti milioni di numeri provenienti approssimativamente da una distribuzione specificata. Quasi ogni RNG farà, quindi tutto ciò di cui ho bisogno è uno che non sia così catastroficamente povero da essere inutile come un RNG. Qualsiasi altra cosa sta semplicemente rallentando il lavoro inutilmente. Tendo a usare Mersenne Twister, ma è semplicemente perché funziona abbastanza bene, ho il codice ed è ragionevolmente veloce.

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.