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?
risposta
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).
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.
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.
- 1. Quando dovrei usare std :: thread :: detach?
- 2. Impossibile risolvere 'std :: default_random_engine'
- 3. Devo usare std :: e boost :: prefissi ovunque?
- 4. std :: mt19937 richiede il riscaldamento?
- 5. Devo usare std :: set o std :: unordered_set per un set di puntatori?
- 6. Come usare std :: atomic efficiently
- 7. Devo usare std :: pointer condiviso per passare un puntatore?
- 8. Quando dovrei usare std :: async con sincronizzazione come criterio?
- 9. Devo usare std :: unique_ptr <T> in una variabile membro std :: vector nella mia classe?
- 10. Devo usare @EJB o @Inject
- 11. È possibile usare std :: accumulate con std :: min?
- 12. Devo usare Meteor.startup() o $ (function() {})
- 13. dovrei usare urandom o openssl_random_pseudo_bytes?
- 14. Devo usare System.out.println() o qualcos'altro?
- 15. Devo usare nav o ul
- 16. Non riesco a usare std :: vector di auto_ptr - dovrei usare shared_ptr?
- 17. Devo usare typeclass o no?
- 18. Devo usare Point.x o Point.getX()?
- 19. Devo usare alias o alias_method?
- 20. Devo usare MapView o MapFragment
- 21. Puoi usare `std :: remove_if` su un contenitore di` std :: unique_ptr`?
- 22. Devo smettere di usare classi/interfacce di base astratte e usare invece boost :: function/std :: function?
- 23. È un'ottimizzazione prematura usare std :: move()?
- 24. std :: default_random_engine generare valori tra 0,0 e 1,0
- 25. std :: remove_reference o std :: remove_cv prima?
- 26. Quale dovrei usare? decimal.Add() o "+"
- 27. Quale usare const char [] o const std :: string?
- 28. Devo usare Angular.copy() o _.clone()?
- 29. Devo usare rand() o rand_s()?
- 30. Devo usare em o px?
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
Sono curioso quando si dovrebbe scegliere 'std :: default_random_engine'. Ha qualche vantaggio rispetto a 'std :: mt19937'? – Deqing