2015-05-14 19 views
10

quando voglio generare numeri casuali usando std :: random, quale motore dovrei preferire? lo std::default_random_engine o lo std::mt19937? quali sono le differenze?Devo usare std :: default_random_engine o dovrei usare std :: mt19937?

+1

Consultare la documentazione. La scelta del generatore di numeri casuali dipende dalla tua situazione particolare. Detto questo, il Mersenne Twister è spesso un buon punto di partenza. – Bathsheba

+0

Sono curioso quando si dovrebbe scegliere 'std :: default_random_engine'. Ha qualche vantaggio rispetto a 'std :: mt19937'? – Deqing

risposta

10

Per randomes leggeri (ad esempio giochi), si può certamente considerare default_random_engine. Ma se il codice dipende fortemente dalla qualità della casualità (ad esempio software di simulazione), non si dovrebbe usare, in quanto dà, garantisce solo minimalista:

E 'la selezione del L'implementazione biblioteca di un generatore che fornisce almeno comportamento del motore accettabile per relativamente casuale, inesperto, e/o uso leggero.

I mt19937 32 bit mersene twister (o la sua controparte 64 bit mt19937_64) è sull'altro lato un well known algorithm che passa molto bene statistical randomness tests. Quindi è l'ideale per applicazioni scientifiche.

Tuttavia, non si prenderà in considerazione nessuno dei due, se i numeri casuali sono destinati allo scopo security (ad esempio crittografico).

3

Attualmente la domanda ha un voto ravvicinato in base all'opinione pubblica. Contro questo direi che dire che std::default_random_engine è oggettivamente una cattiva scelta, dal momento che non sai cosa ottieni e il passaggio delle librerie standard può dare risultati diversi nella qualità della casualità che ricevi.

Dovresti scegliere qualsiasi generatore di numeri casuali che ti dia il tipo di qualità che stai cercando. Se devi scegliere tra i due, vai con std::mt19937 in quanto ti dà un comportamento prevedibile e definito.

1

Si rivolgono a diversi bisogni. Il primo è un alias definito dall'implementazione per un determinato generatore, mentre il secondo utilizza in modo specifico l'algoritmo Mersenne-Twister con un seme a 32 bit.

Se non si dispone di requisiti particolari, std::default_random_engine dovrebbe essere ok.

Problemi correlati