2013-01-21 16 views
15

Per il codice che utilizza std::random_shuffle, ho bisogno di impostare un seme casuale in modo che le sequenze pseudocasuali prodotte varino in ogni esecuzione del programma.C++ moderno per usare srand per impostare i seed casuali?

Il code example here effettua una chiamata a

srand (unsigned (time (NULL))); 

che deve

#include <ctime> 
#include <cstdlib> 

mi chiedo: dal C++ 11 include importanti aggiornamenti di generazione di numeri pseudo, è questo ancora attuale? Cosa dovrei usare per impostare il seme casuale per std::random_shuffle?

+0

Vedere anche [Perché i metodi std :: shuffle sono deprecati in C++ 14?] (Http://stackoverflow.com/q/22600100/1708801) –

risposta

25

random_shuffle utilizza un generatore di numeri casuali definito dall'implementazione, a meno che non ne venga fornito uno. Quindi, no, usare srand non è necessariamente corretto.

Altrimenti utilizza il generatore fornito. È possibile utilizzare rand se si vuole essere sicuri di ciò che viene utilizzato.

srand(seed); 
std::random_shuffle(first, last, [](int n) { return rand() % n; }); 
// this is a biased generator 
// see <http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx> 

Tuttavia, mi consiglia di utilizzare le nuove strutture <random> invece di rand(). Segue un esempio.

std::default_random_engine gen(seed); 

std::shuffle(first, last, gen); 
+0

È possibile fornire un esempio di codice? Ho difficoltà a capire cosa fare esattamente. – clstaudt

+0

@cls Ho incluso un esempio. –

+0

Grazie. Cosa devo impostare 'lo' e' hi' su? – clstaudt

3

Se si utilizza C++ 11, pensare di utilizzare std::shuffle invece di std::random_shuffle, e il superamento di un generatore di numeri casuali, come nell'ultimo esempio here

+2

Come è la versione di 'random_shuffle' che accetta un' RandomFunc && r' diverso da 'shuffle'? – David

+2

@Dave richiede una funzione che quando viene chiamata come 'r (n)' restituisce un numero casuale nell'intervallo [0, n). –

0

Se davvero a cuore la precisione, la qualità e la diversità dei modi per generare numeri casuali, suggerirei caldamente di considerare l'utilizzo del famoso Gnu Scientific Library (GSL)

Ciò consente una generazione uniforme e vari algoritmi per il meglio. Vedi here.

appositamente this e this descrive gli algoritmi disponibili:

— gsl_rng_mt19937 
— gsl_rng_taus 
— gsl_rng_taus2 
— gsl_rng_gfsr4 
... 

EDIT: anche boost::random dovrebbe essere una buona alternativa in considerazione del GPLness di GSL (ma non ho mai distribuiti con esso ...).

+2

È GPL, potrebbe essere un problema. – user1095108

+0

Esatto, non ne ho ancora parlato, visto che anch'io sono GPLed-like ;-) –

Problemi correlati