2014-12-15 8 views
7

Ich erzeuge eine Sequenz von Zufallszahlen mit Std :: mt19937_64. Ich habe bemerkt, dass ich, wenn ich mit GCC und Clang auf der gleichen Plattform mit dem gleichen Seed laufe, eine andere Sequenz erhalte. Ich habe das Programm über Valgrind ausgeführt und keine nicht initialisierte Speicher gefunden.Mersenne Twister Reproduzierbarkeit über Compiler

Gibt es irgendeine Garantie für die Reproduzierbarkeit über Compiler oder über Plattformen hinweg mit std :: mt19937_64?

Edit: Laufen mit std :: normal_distribution

+3

Wenn Sie Cross-Compiler-Kompatibilität benötigen, können Sie [Boost.Random] (http://www.boost.org/doc/libs/1_57_0/doc/html/boost_random.html) verwenden. –

+0

Vielleicht bin ich hier ein bisschen naiv, aber wenn sie denselben Algorithmus und dieselben Parameter verwenden, sollten sie nicht die gleiche Sequenz reproduzieren? – Rufflewind

+3

Da Sie normale Verteilung verwenden sehen Sie meine Antwort hier (http://stackoverflow.com/a/24554535/1708801) im Grunde ist die Antwort nein, aber die zugrunde liegenden Suchmaschinen sollten konsistent aussehen wie ein Duplikat. –

Antwort

10

Die Zahlen, die Motoren erzeugen garantiert reproduzierbar über Implementierungen sein, aber die Verteilungen sind es nicht. (Quelle: rand() considered harmful).

Der N3337 Standardentwurf sagt über normal_distribution (26.5.8.5.1):

A normal_distribution Zufallszahlenverteilung Zufallszahlen x erzeugt verteilt entsprechend der Wahrscheinlichkeitsdichtefunktion

enter image description here

Die Verteilungsparameter μ und σ werden auch als Mittelwert und Standardabweichung dieser Verteilung

bezeichnet

Und ... das ist es. Es gibt weder die Reihenfolge der generierten Zahlen noch den Algorithmus oder die Beispielausgaben an.

Der Standard ist sehr ausführlich über mersenne_twister_engine (26.5.3.2), gibt es die Zustandsübergangsfunktion, Initial Seeding-Algorithmus und so weiter.

+1

Wird dies durch einen Unterschied verursacht, wie die Funktionen mit dem Seeding umgehen? –

+1

Die Gleichung ist falsch. Ich denke du hast den falschen Link gewählt. – rubenvb

+0

@ Mr.Llama Ich bezweifle es. Der Standard ist sehr detailliert darüber, wie das Seeding funktionieren soll. – milleniumbug