2014-12-15 10 views
11

Secondo lo standard, std::random_device funziona nel seguente modo:Quando uso std :: random_device?

result_type operator()();

Restituisce: un valore casuale non deterministico, uniformemente distribuito tra min() e max(), inclusiva. È definito dall'implementazione come vengono generati questi valori.

E ci sono un paio di modi si può usare. Seminare un motore:

std::mt19937 eng(std::random_device{}()); 

come motore per sé:

std::uniform_int_distribution<> uid(1, 10); 
std::cout << dist(dev); 

Poiché è definito dall'implementazione, non suona forte come dire std::seed_seq o srand(time(nullptr)). Preferisco usarlo come seme, come motore o per niente?

+1

Sfortunatamente, devi stare attento. Ad esempio, [MinGW non implementa 'std :: random_device' bene] (http://stackoverflow.com/q/18880654/10077). –

+0

Vorrei andare per la prima opzione, ma dipende anche dalla qualità del motore con cui vuoi seminare. – didierc

+0

Potrebbe essere più forte di quelle tecniche che non sono crittograficamente forti. Ad esempio, Visual C++ utilizza [RtlGenRandom] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694.aspx). –

risposta

14

In generale, std::random_device deve essere la fonte delle informazioni più casuali a cui è possibile accedere sulla piattaforma. Detto questo, l'accesso è molto più lento di std::mt19937 o cosa no.

Il comportamento corretto è quello di utilizzare std::random_device per seminare qualcosa come std::mt19937.

+1

Se Non mi sbaglio, 'std :: random_device' potrebbe esaurire l'entropia se cerchi di ottenere un sacco di numeri da esso. Questo potrebbe bloccarlo fino a quando non muovi il mouse o qualcosa del genere. –

+1

* Dovrebbe * essere, ma a volte non lo è. Vedi http://stackoverflow.com/questions/18880654/why-do-i-get-same-sequence-for-everyrun-with-stdrandom-device-with-mingw-gcc4 –

Problemi correlati