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?
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
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
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