2017-06-08 5 views
-2

Um die Zeichen der Zeichenfolge st zu mischen, verwende ich std::shuffle und einen Zufallsgenerator, der von einem bekannten Samen gefüttert wird. Dies ist Teil eines Encoders, der der Einfachheit halber nur die Eingabe mischt.dishuffle ein Array von int/char

Die gemischten Daten werden an einen Decoder gesendet. Auf dieser Seite haben wir keinen Zugriff auf die ursprüngliche Eingabe, sondern auf die gemischte Eingabe.

Wie kann ich deshuffle die Zeichenfolge shuffledSt, den gleichen Zufallszahlengenerator und das gleiche Saatgut verwenden, bis ich st die ursprüngliche Zeichenfolge erhalten kann?

#include <random> 
#include <algorithm> 
int main (int argc, char* argv[]) 
{ 
    std::string st = "asdfgh"; 
    int seed = 1000; 

    std::shuffle(st.begin(), st.end(), std::default_random_engine(seed)); 
    std::cerr << st << '\n'; 

    std::string shuffledSt = st; 

    return 0; 
} 
+1

'const Auto saved_st (st);' nicht für Sie arbeiten? –

+4

"Unshuffle"? Meinst du "sortieren", oder meinst du "magisch die ursprüngliche Schnur wiederherstellen, egal wie es aussah"? Oder ist das eigentliche Problem, dass Sie wirklich eine gemischte _copy_ von "st" wollen, anstatt es zu ändern? – You

+1

'default_random_engine' ist die Implementierung definiert, Sie können dies also nicht portabel machen. ** Wenn ** Sie wüssten, welche Art von Zufalls-Engine es verwendet, und wenn es invertierbar wäre (zum Beispiel ein linearer kongruenter Generator), könnten Sie ein "Unshuffle" implementieren, aber Sie müssen auch die Implementierung von 'std kennen :: shuffle ", um zu versuchen, diesen Prozess ebenfalls zu invertieren. Lange Rede, kurzer Sinn, wahrscheinlich nicht möglich. – CoryKramer

Antwort

3

Ich schlage vor, folgenden Algorithmus

  • einen Vektor generieren indices mit std::iota von st.size() Elemente.
  • Mischen Sie diesen Vektor mit dem gleichen Motor mit dem gleichen Saatgut.
  • Während über den neu gemischt Vektor Looping, erzeugen Sie eine neue Zeichenfolge result wo result[indices[i]] = st[i]