2009-01-21 6 views
5

Ich habe diesen langen und komplexen Quellcode, der einen RNG mit einem Fix Samen verwendet.C++. Ist es möglich, dass ein Zufallszahlengenerator unterschiedliche Zufallsvariablen in zwei verschiedenen Maschinen unter Verwendung desselben Samens angibt?

Dieser Code ist ein Simulator und die Parameter dieses Simulators sind die zufälligen Werte, die von diesem RNG angegeben werden. Wenn ich den Code in der gleichen Maschine ausführen, egal wie viele Versuche ich mache, ist die Ausgabe die gleiche. Aber wenn ich diesen Code auf zwei verschiedenen Maschinen ausführe und die Ausgaben beider Maschinen vergleiche, sind sie unterschiedlich.

Ist es möglich, dass zwei verschiedene Maschinen mit dem gleichen Zufallszahlengenerator und dem gleichen Seed einen irgendwie unterschiedlichen Output erzeugen?

Die Compiler-Version, die Bibliotheken und das Betriebssystem sind identisch.

+0

könnten Sie bitte sagen, welche PRNG Sie verwenden (Bibliothek/Funktion), wenn es Open Source ist, würde ich gerne aus Neugier auf den Quellcode sehen .. :) – falstro

+0

Durch "vergleichen Sie die Ausgänge" , vergleichen Sie die Ausgabe des Rng oder der Simulation? –

Antwort

9

Dies ist sicherlich möglich, da der RNG möglicherweise maschinenspezifische Daten mit dem Seed wie der Netzwerkkartenadresse kombiniert, um die Zufallszahl zu generieren. Es ist im Grunde implementierungsspezifisch.

4

Wenn es sich um einen Pseudozufallsgenerator handelt, der nichts außer dem Seed verwendet, um eine Zahlensequenz zu erzeugen, dann können diese per Definition nicht unterschiedlich sein. Wenn jedoch diejenigen, die Sie verwenden, etwas verwenden, das von der Maschine abhängt, um den Keim zu stören, oder ganz einfach, einen anderen Algorithmus, ist es natürlich durchaus möglich. Welche Implementierung verwenden Sie, und wenn es sich um eine Standardbibliotheksimplementierung handelt, sind beide Versionen identisch?

+0

Die Frage besagt, dass Bibliotheken, Compiler und OS identisch sind. –

+0

Noch - könnte Linux/glibc/gcc mit verschiedenen Fließkommaeinstellungen sein. – MSalters

+0

Wenn Sie nichts über den Generator wissen, kann er auf etwas zugreifen, das für die Maschine beim Seeding spezifisch ist. –

0

Vielleicht ist es ein kleines/großes Endian-Problem, oder der Code erkennt den Prozessor in irgendeiner Weise. Der einfachste Weg wäre, Breakpoints oder ähnliche Debug-Routinen zu verwenden, um die Seeding-Routinen und den RNG selbst zu beobachten.

5

Da sie unterschiedliche Ergebnisse liefern, ist es offensichtlich möglich, dass sie zu unterschiedlichen Ergebnissen führen. Leicht zu beantwortende Frage, weiter!

Im Ernst: Ohne den Quellcode des RNG zu kennen, ist es schwer zu wissen, ob Sie einen Fehler oder eine Funktion beobachten. Aber es klingt, als ob der fragliche RNG einen zweiten Samen von irgendwo anders verwendet, z. die aktuelle Uhrzeit oder ein Hardware-abhängiger Wert wie die MAC-Adresse der Netzwerkkarte.

+0

Nicht die aktuelle Zeit, da es immer wieder dieselben Ergebnisse auf seiner Maschine produziert, aber die MAC-Adresse ist sicherlich eine Möglichkeit. – gkrogers

-1

Es hängt sehr davon ab, welchen RNG Sie verwenden. Dinge wie random(3) oder die rand48(3) Familie sind so entworfen, dass sie dieselbe Sequenz zurückgeben, wenn sie mit dem gleichen Seed ausgeführt werden. Nun, wenn der RNG, den Sie verwenden, /dev/random Ausgabe nehmen, sind alle Wetten deaktiviert und die Ergebnisse werden unterschiedlich sein.

2

Ja. Es gibt zum Beispiel Fließkomma-Zufallszahlen, deren Ergebnisse davon abhängen können, ob Ihre CPU IEEE-Gleitkommazahlen korrekt implementiert (nicht in ISO C++ garantiert). Außerdem können Effekte wie das Überfüllen von 80 Bit in den Speicher die Ergebnisse beeinflussen.

Es gibt auch einige mögliche Verwirrung über die Vorstellung von einem "Samen". Einige Leute definieren den Startparameter als alle Eingaben, um den Anfangszustand des Zufallszahlengenerators festzulegen. Andere beschränken es nur auf die explizite Eingabe in Code und schließen implizite Eingaben von z.B. HW-Quellen oder/dev/random.

5

Wenn Sie etwas benötigen, das von Maschine zu Maschine wiederholt werden kann, versuchen Sie die Boost Random Number Library.

+0

+1 (weil das alles ist, was ich tun kann). Im Allgemeinen haben System-RNGs oft Probleme, und Boost für einen besseren zu wählen, ist oft eine ausgezeichnete Idee. –