2013-10-07 12 views
21

Die Funktion std::shuffle wurde in C++ 11 eingeführt:Was ist der Unterschied zwischen Shuffle und random_shuffle C++

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

und es hat die gleiche Signatur als eine der Überlastungen von std::random_shuffle die auch eingeführt wurde in C++ 11:

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

die Differenz ist in dem dritten Parameter, wobei:

URNG muss erfüllen die Anforderungen von UniformRandomNumberGenerator

Ist das alles? Ist der Unterschied nur, dass shuffle eine zusätzliche Kompilierzeitprüfung durchführt? Ist das Verhalten sonst gleich?

+1

Btw, in der Norm "X muss die Anforderungen von Y erfüllen" bedeutet nicht, dass die Implementierung es überprüft. Dies bedeutet, dass das Verhalten nicht definiert ist, wenn X die Anforderungen von Y nicht erfüllt. In jedem Vorlagencode wird eine gewisse Überprüfung der Kompilierungszeit durchgeführt, aber in der Regel nur die Teile der Schnittstelle Y, die die Implementierung tatsächlich verwendet. –

+0

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

Antwort

13

Wenn Sie die Dokumentation auf cppreference.com eng lesen, werden Sie feststellen, dass die RandomFunc weitergegeben random_shuffle eineandere Schnittstelle hat. Es wird als r(n) aufgerufen. Dies gab es vor C++ 11.

std::shuffle verwendet eine standardisierte Methode zum Abrufen von Zufallszahlen und ruft g() auf. Diese standardisierten Zufallszahlengeneratoren wurden mit C++ 11 zusammen mit std::shuffle eingeführt.

+0

+1, und '' war eine lange Zeit und ich bin sehr froh, dass es getan hat. Ich war gerade dabei, dies zu schreiben, Beispielcode und alles, aber Ihr Brief behandelte es gut. Hinweis: 'r (n)' gibt eine Zahl zwischen 0 und (n-1) zurück. – WhozCraig

16

std::random_shuffle verwendet std::rand() Funktion die Elemente randomisieren, während der std::shuffleurng verwendet, die einen besseren Zufallsgenerator ist, wenn auch mit der besonderen Überlastung von std::random_shuffle, Sie das gleiche Verhalten (wie bei der std::shuffle) bekommen können, aber das erfordert, dass Sie Mach etwas Arbeit, um das dritte Argument zu bestehen.

Dit Vortrag von Stephan T. Lavavej, in dem er erklärt, warum std::rand eine schlechte Funktion ist und was C++ sollten Programmierer statt:

Der Kern ist, std::shuffle ist eine Verbesserung gegenüber std::random_shuffle, und C++ - Programmierer sollten die erstere bevorzugen.

+0

Nicht, wenn Sie die in der Frage angegebene Überladung verwenden. In diesem Fall wird "r" als Zufallszahlengenerator verwendet. – Grizzly

+0

Aber was ist mit der besonderen Überlastung, die ich gepostet habe. Verwendet man irgendwo std :: rand? –

+3

@MartinDrozdik It * kann * (und der Standard * tut *). – WhozCraig

Verwandte Themen