2013-10-07 16 views
21

La funzione std::shuffle è stata introdotta in C++ 11:Qual è la differenza tra riordino e random_shuffle C++

template< class RandomIt, class URNG > 
void shuffle(RandomIt first, RandomIt last, URNG&& g); 

ed ha la stessa firma uno dei sovraccarichi di std::random_shuffle anch'esso introdotto in C++ 11:

template< class RandomIt, class RandomFunc > 
void random_shuffle(RandomIt first, RandomIt last, RandomFunc&& r); 

la differenza è nel terzo parametro dove:

URNG deve soddisfare i requisiti di UniformRandomNumberGenerator

È tutto? La differenza è che solo lo shuffle esegue un controllo extra di compilazione? Il comportamento è lo stesso?

+1

Btw, nello standard "X deve soddisfare i requisiti di Y" non significa che l'implementazione lo controlli. Significa che il comportamento non è definito se X non soddisfa i requisiti di Y. In qualsiasi codice di modello ci sarà un controllo in fase di compilazione, ma di solito solo delle parti dell'interfaccia Y che l'implementazione utilizza effettivamente. –

+0

http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful – doctorlove

risposta

13

Se leggete la documentazione in cppreference.com da vicino, vi accorgerete che il RandomFunc passato a random_shuffle ha un diversa interfaccia. Viene invocato come r(n). Questo esisteva prima del C++ 11.

std::shuffle utilizza un metodo standardizzato per ottenere numeri casuali e invoca g(). Questi generatori di numeri casuali standardizzati sono stati introdotti con C++ 11 insieme a std::shuffle.

+0

+1, e '' è stato un lungo periodo di attesa e sono molto contento di averlo fatto. Stavo scrivendo questo, codice di esempio e tutto, ma il tuo riassunto lo ha trattato bene. Nota: 'r (n)' restituisce un numero compreso tra 0 e (n-1). – WhozCraig

16

std::random_shuffle utilizza std::rand() funzione di randomizzare gli articoli, mentre il std::shuffle usa urng che è un generatore casuali migliore, anche se con il particolare di sovraccarico di std::random_shuffle, è possibile ottenere lo stesso comportamento (come con la std::shuffle), ma che richiede di fare del lavoro per passare il terzo argomento.

Guarda questo discorso da Stephan T. Lavavej, in cui spiega il motivo per cui std::rand è una cattiva funzione e quali C++ i programmatori dovrebbero usare al posto:

il succo è, std::shuffle è un miglioramento rispetto a std::random_shuffle e i programmatori C++ dovrebbero preferire l'uso del primo.

+0

Non se si utilizza il sovraccarico specificato nella domanda. In questo caso usa 'r' come generatore di numeri casuali. – Grizzly

+0

Ma per quanto riguarda il sovraccarico particolare che ho postato. Quella usa std :: rand da qualche parte dentro? –

+3

@MartinDrozdik It * can * (e il valore predefinito * fa *). – WhozCraig