C ++ std :: mt19937 und rng Zustand speichern / laden und Portabilität

8

Ich möchte in der Lage sein, den Zustand eines RNG zu speichern und zu laden, so dass ich die gleichen zufälligen Werte von einem bestimmten Punkt (Anwendung speichern / Schnappschuss) reproduzieren kann.

Ich sehe, es gibt einen Operator & lt; & lt; und & gt; & gt; Überladung, die in einer Zeichenfolge als Folge von Zahlen zu speichern scheint.

  • Ist das die beste / einzige Möglichkeit zu sparen? Es würde mir nichts ausmachen, wenn ich nur den binären Zustand mit fester Größe und nicht diese durch Leerzeichen getrennte Zeichenkette hätte, die ich dann für mein Dateiformat vorzeichen oder Trennzeichen setzen müsste.
  • Ist das überhaupt tragbar? z.B. kann ich dies zwischen verschiedenen Compiler-Versionen oder sogar zwischen MSVC und GCC übertragen, um den gleichen Datensatz bei identisch konfigurierten Verteilungen zu erzeugen (zu einer kleinen Fehlergrenze im Falle von Fließkommazahlen und genau für Integer-Berechnungen)?
Fire Lancer 31.12.2014, 22:47
quelle

2 Antworten

3

Ja, operator<< und operator>> sind die einzige Möglichkeit, den Zustand eines Zufallsgenerators zu importieren oder zu exportieren. Wenn Sie möchten, können Sie die Textdarstellung ganz einfach in und aus der Binärdatei konvertieren.

Deserialisierung und Serialisierung von mt19937 state sollte zwischen Implementierungen übertragbar sein. Das Ergebnis des Lesens und Schreibens des Zustands der Engine über die Streaming-Operatoren ist vom Standard gut definiert, solange Sie sicherstellen, dass die Streams mit demselben Gebietsschema getränkt sind.

Siehe § 26.5.1.5 für die Anforderungen von operator<< und operator>> , gefolgt von § 26.5.3.2 für die textuelle Darstellung von mersenne_twister_engine , wobei mt19937 gut definiert ist typedef von.

    
Collin Dauphinee 01.01.2015 00:19
quelle
0

Oben auf der vorherigen Antwort:

  • Textdarstellung über op & lt; & lt; speichert nur den richtigen RNG-Status, wenn er über op & gt; & gt; mit demselben Gebietsschema. Das Ändern der Ländereinstellung führt zu einem Problem

  • Die Wahl von default_random_engine ist die Implementierung definiert. Es ist ein typedef, aber es kann auf verschiedenen Plattformen auf verschiedene reale Engines gesetzt werden (§ 26.5.5). Somit wird die Verwendung von op & lt; & lt; und op & gt; & gt; Das Speichern / Wiederherstellen von Zuständen verbietet die Verwendung der Standard-Engine

  • Während Generatoren ziemlich streng spezifiziert sind, glaube ich nicht, dass Distributionen zwischen Plattformen identisch sein müssen. Der Speicherzustand hilft hier möglicherweise nicht sehr bei der Reproduzierbarkeit

Ich würde empfehlen, dieses Dokument zur Hand zu haben, nur für den Fall Ссылка

    
Severin Pappadeux 01.01.2015 07:12
quelle

Tags und Links