Ich versuche, eine Klasse zu erstellen, die Zufallszahlen für mehrere Verteilungen erzeugt, während sie reproduzierbar bleibt (indem ein Anfangswert gesetzt wird).
Der Code scheint zu funktionieren, bis ich anfange, die normale Verteilung und die seltsame Fehleroberfläche zu benutzen. Dies sind hauptsächlich:
double a = rnd.rnorm(0.0, 1.0);
-Zeile (Zeile 40) auskommentiere (das heißt, wenn ich rnorm
vor dem Setzen eines Seeds anrufe), stimmt die erste Zufallszahl der Normalverteilung nicht mehr überein, die Zufallszahlen stimmen danach wieder überein int n = 3;
) Nun ist meine Frage, was verursacht dieses seltsame Verhalten? Habe ich RNG
falsch implementiert? Und am wichtigsten, wie kann ich es beheben?
Wenn Sie die Ergebnisse selbst testen möchten, können Sie Ссылка
verwendenoder das
%Vor% Wenn ich n = 4
einstelle und a
kommentiert lasse, erhalte ich Folgendes (was genau das ist, was ich will / brauche; reproduzierbare "zufällige" Zahlen):
Nun zu den Fehlern. Wenn n = 5
(oder irgendeine ungerade Zahl) gesetzt wird, erhalte ich:
Was scheinbar alle normalen Zahlen um 1 verschiebt. Die einheitlichen Zahlen bleiben erhalten (was gut ist, denke ich).
Das Uncommentment der einen Zeile (d. h. Aufruf von rnd.rnorm(0.0, 1.0)
einmal vor Setzen der Seeds) führt zur folgenden Ausgabe (mit n = 4
oder einer anderen geraden Zahl)
Der scheinbar nur die erste normale Zufallszahl unterbricht, wobei die Einheitszahlen wieder in Ordnung sind.
Wenn ich die beiden Punkte zusammen verwende (die Zeile wird unkommentiert und setzt n auf eine ungerade Zahl), bekomme ich das
%Vor%Nun wird die zweite Anzahl von normalen Zufallszahlen um eins in die andere Richtung (Lead) verschoben.
Ich verwende dies auf einem Ubuntu 16.04 und g++ --version
g++(Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Es scheint nicht mit dem spezifischen Generator verbunden zu sein, d. h. das Ersetzen von std::mt19937 re {};
mit std:: linear_congruential_engine<std::uint_fast32_t, 48271, 0, 2147483647> re {};
oder von std::subtract_with_carry_engine<std::uint_fast64_t, 48, 5, 12> re{};
führt zu demselben Verhalten (aber offensichtlich mit anderen Zahlen).