2016-06-28 4 views
7

Ich habe zwei Vektoren mit der gleichen Anzahl von Elementen, aber ihre Typen haben völlig unterschiedliche Größen. Ich muss sie mischen, so dass beide nach dem Mischen die exakt gleiche Reihenfolge haben (jedes Element in einem Vektor steht mit jedem Element im anderen in Beziehung). Die Art, wie ich fand, es zu tun war:Gewährleistet `std :: shuffle` die gleiche Reihenfolge mit demselben Seed auf verschiedenen Vektoren?

// sizeof(a[0]) != sizeof(b[0]) 
// a.size() == b.size() 
{ 
    std::mt19937 g(same_seed); 
    std::shuffle(a.begin(), a.end(), g); 
} 
{ 
    std::mt19937 g(same_seed); 
    std::shuffle(b.begin(), b.end(), g); 
} 

Kann ich sicher sein, dass beide Vektoren die gleiche Art und Weise gemischt werden? Ist diese Implementierung abhängig? Habe ich eine solche Garantie von std::shuffle Spezifikation?

+4

Sie würden wahrscheinlich am ehesten in einen Vektor von Paaren zippen, bevor Sie den Shuffle machen, oder stattdessen einen neuen Vektor von Indizes erstellen, den Index mischen und diesen verwenden, um in die parallelen Vektoren zu indizieren. – Taywee

+0

Mein erster Versuch war der Vektor der Indizes, aber meine Daten sind groß und passen nicht zu zwei Kopien in meinem Speicher, also habe ich versucht, es von der Festplatte in der gemischten Reihenfolge zu laden, was natürlich wahnsinnig langsam war. Also habe ich diesen anderen Weg gemacht, um sequentiell (sehr schnell) von der Festplatte lesen und an Ort und Stelle mischen zu können (kein doppelter Speicher). – lvella

+0

Die Spezifikation garantiert dies nicht ganz, obwohl es schwer ist, sich eine Implementierung vorzustellen, die die Einschränkungen, denen der Standard unterliegt, nicht berücksichtigt. Der 'Suffle'-Algorithmus selbst scheint ziemlich einfach zu schreiben, also würde ich meine eigene Implementierung schreiben, die mir die Garantie geben würde. https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle – Galik

Antwort

8

Es gibt eine interessante Aussage über shuffle in der Spezifikation:

Bemerkungen: In dem Maß, dass die Implementierung dieser Funktion Verwendung von Zufallszahlen macht, das Objekt g wird als die Quelle der Zufälligkeit der Umsetzung dienen.

Trotzdem hilft diese Aussage Ihnen nicht. Der Abschnitt "Bemerkungen" ist ein normativer Text, also besagt das, dass g die Zufallszahlen zur Verfügung stellt, um die gemischte Reihenfolge zu bestimmen. Es erklärt jedoch nicht, dass g der einzige Faktor ist, der die Permutation bestimmt.

Während die Größe des Werts des Containers wahrscheinlich keine Rolle spielt, gibt es keine Garantie, dass eine Eigenschaft des Typs etwas nicht beeinträchtigen würde. Wenn der Werttyp beispielsweise trivial kopierbar ist, könnte eine Implementierung eine andere Version der Funktion verwenden, die einen etwas anderen Algorithmus verwendet. Wenn es sich jedoch um einen registergroßen Wert handelt, ist dies möglicherweise nicht der Fall.

Kurz gesagt, nein, std::shuffle garantiert nicht das, wonach Sie suchen.

Verwandte Themen