Erzeugt jede Maschine das gleiche Ergebnis einer Zufallszahl, indem sie denselben Samen verwendet?

8

Ich bin momentan im Zufallsgenerator festgefahren. Die Anforderungsspezifikation zeigt ein Beispiel wie folgt:

%Vor%

Das Rand-Ergebnis wird nicht direkt ausgegeben, sondern für andere Leistungen verwendet.

Ich hatte den gleichen Code wie oben geschrieben, um eine Zufallszahl durch einen Seed 3412 zu erzeugen. Das Ergebnis der Restleistung ist jedoch bei Sample völlig anders.

Das generierende Ergebnis ist 518435373, ich habe den gleichen Code benutzt, der auf dem on-line c # Compiler versucht wird, aber erhalten unterschiedliches Ergebnis der Erzeugung, die 11688046 ist, war das Restleistungsergebnis auch mit dem Beispiel unterschiedlich.

Ich frage mich nur, soll das in verschiedenen Maschinen anders sein?

BTW, könnte jemand das Ergebnis von Ihrer Maschine zur Verfügung stellen, nur sehen, ob es dasselbe mit mir ist.

    
Ivan Li 31.08.2012, 11:29
quelle

4 Antworten

14

Ich würde erwarten, dass jede eine Implementierung dieselbe Sequenz für denselben Seed angibt, aber es kann durchaus unterschiedliche Implementierungen geben. Zum Beispiel könnte ein "Online-C # -Compiler" am Ende Mono verwenden, was eine andere Implementierung als .NET erwarten lässt.

Ich weiß nicht, ob sich die Implementierungen zwischen Versionen von .NET geändert haben, aber auch das scheint durchaus möglich.

In der Dokumentation für den Random(int) -Konstruktor heißt es:

  

Wenn Sie verschiedenen Random-Objekten einen identischen Startwert zuweisen, erzeugt jede Instanz identische Folgen von Zufallszahlen.

... aber es spezifiziert nicht die Implikationen von verschiedenen Versionen usw. Heck, es gibt nicht einmal an, ob die x86- und x64-Versionen die gleichen Ergebnisse liefern werden. Ich würde die gleichen Ergebnisse innerhalb einer bestimmten CLR-Instanz erwarten (d. H. Ein Prozess und nicht zwei CLRs, die nebeneinander ausgeführt werden, entweder *.

Wenn Sie etwas Stabileres brauchen, würde ich mit einem spezifizierten Algorithmus beginnen - ich wette, dass es Implementierungen des Mersenne Twisters usw. gibt.

    
Jon Skeet 31.08.2012, 11:34
quelle
6

Es wird nicht angegeben, dass es ein solches Versprechen gibt, also sollten Sie davon ausgehen, dass dies nicht der Fall ist.

Eine gute Regel mit jeder Spezifikation ist nicht, Versprechungen zu machen, die für eine vernünftige Verwendung nicht erforderlich sind, so dass Sie später die Dinge verbessern können.

Tatsächlich sagt Random 's Dokumentation:

  

Die aktuelle Implementierung der Random-Klasse basiert auf dem subtraktiven Zufallszahlengenerator von Donald E. Knuth.

Beachten Sie den Ausdruck "aktuelle Implementierung", was bedeutet, dass sich dies in Zukunft ändern kann. Dies legt sehr stark nahe, dass es nicht nur kein Versprechen gibt, zwischen Versionen konsistent zu sein, aber es gibt auch keine Absicht, dies zu tun.

Wenn eine Spezifikation konsistente Pseudozufallszahlen erfordert, muss sie sowohl den Algorithmus als auch den Startwert angeben. In der Tat, auch wenn Random als solches Versprechen gegeben wurde, was ist, wenn Sie eine Nicht-.NET-Implementierung Ihrer gesamten Spezifikation oder eines Teiles Ihrer Spezifikation - oder etwas, das damit interagiert - in der Zukunft benötigen?

    
Jon Hanna 31.08.2012 11:35
quelle
1

Das liegt wahrscheinlich an verschiedenen Framework-Versionen. Schauen Sie sich dies     

Qash 31.08.2012 11:41
quelle
0

Der von Ihnen getestete Online-Anbieter verwendet möglicherweise die Mono-Implementierung der CLR, die sich von der von Microsoft bereitgestellten unterscheidet. Wahrscheinlich ist ihre Random -Klassenimplementierung ein bisschen anders.

    
ken2k 31.08.2012 11:36
quelle

Tags und Links