2015-04-13 26 views
6

Ho bisogno di un generatore di numeri casuali C++ 11 che sia "abbastanza buono" e in cui posso salvare e ripristinare lo stato. Desidero che lo stato salvato sia significativamente più piccolo rispetto a 6,6 kb o così che questo codice produceCome devo scegliere i parametri per uno std :: mersenne_twister_engine più piccolo rispetto allo standard?

std::mt19937 rng (1); 
std::ofstream save ("save.txt"); 
save << rng; 

std::mersenne_twister_engine ha un gran numero di parametri. È un po 'spaventoso.

Per i miei scopi, è sufficiente un periodo dell'ordine di miliardi. Ho sentito parlare di TinyMT, che potrebbe essere appropriato ma non vedo come implementarlo come specializzazione di template.

Come scegliere i parametri? Sospetto che si romperà gravemente se ridurro il parametro "dimensione dello stato" in poche parole.

Vorrei prendere in considerazione l'utilizzo di un motore completamente diverso ma, a parte tollerare un periodo moderato, non voglio sacrificare la qualità della casualità statistica. Artefatti come il seguito (per congruenti lineari) sono inaccettabili.

enter image description here

+0

Potrebbe essere più semplice scrivere semplicemente un wrapper su TinyMT. –

+1

Considera questa tabella (http://www.boost.org/doc/libs/1_57_0/doc/html/boost_random/reference.html#boost_random.reference.generators) se stai andando bene con un motore diverso. Si noti inoltre che il codice salva lo stato del motore in modalità testo, non in binario. La dimensione binaria è solo ~ 2.5kb. – sbabbi

+0

Forse, T.C., ma voglio davvero capire i problemi. E sbabbi, 2.5kb è ancora troppo, per ordine di grandezza. – spraff

risposta

1

Se non hanno bisogno di un sacco di numeri, di qualsiasi dimensione RNG 64bit decenti sarà buono. Fuori superiore del mio cappello molto buon generatore sarebbe XorShift64 *, carta http://arxiv.org/abs/1402.6246, codice https://github.com/Iwan-Zotow/xorshift64STAR

Un'altra opzione da usare è PCG, "Quadratisch. Praktisch. Gut.", La carta e il codice a http://www.pcg-random.org/

Sono sia statisticamente migliore di MT, l'unico svantaggio è il piccolo (er) periodo, ma va bene per te, per quanto posso vedere