Wie speichere ich den Zustand eines Zufallsgenerators in C #?

8

Zu Testzwecken erstelle ich Zufallszahlen mit einem gegebenen Startwert (d. h. nicht basierend auf der aktuellen Zeit).

Somit ist das ganze Programm deterministisch.

Wenn etwas passiert, würde ich gerne kurz vor dem Vorfall einen Punkt wiederherstellen können.

Deshalb muss ich System.Random auf einen vorherigen Zustand wiederherstellen können.

Gibt es eine Möglichkeit, einen Seed zu extrahieren, mit dem ich den Zufallsgenerator neu erstellen kann?

    
Onur 22.10.2013, 07:58
quelle

5 Antworten

9

Im Einklang mit dem Antwort hier gegeben , schrieb ich eine kleine Klasse, um beim Speichern und Wiederherstellen des Staates zu helfen.

%Vor%

Sie können diesen Code in LINQPad testen.

    
Lasse Vågsæther Karlsen 22.10.2013, 08:39
quelle
2

Das ist, was ich heraufkam:

Grundsätzlich extrahiert es das private Seed-Array. Sie müssen nur vorsichtig sein, um ein "ungeteiltes" Array wiederherzustellen.

%Vor%     
Onur 22.10.2013 08:45
quelle
1

System.Random ist nicht versiegelt und seine Methoden sind virtuell. Sie könnten also eine Klasse erstellen, die die Anzahl der generierten Zahlen zählt, um den Zustand zu verfolgen, etwa wie folgt:

%Vor%

Beispielverwendung:

%Vor%

Ausgabe:

%Vor%     
sloth 22.10.2013 08:08
quelle
1

Ich bin mir bewusst, dass diese Frage bereits beantwortet wurde, aber ich wollte meine eigene Implementierung bereitstellen, die momentan für ein Spiel verwendet wird, das ich gerade erstelle. Im Wesentlichen habe ich meine eigene Random-Klasse mit dem Code von .NET Random.cs erstellt. Ich fügte nicht nur mehr Funktionalität hinzu, sondern fügte auch eine Möglichkeit hinzu, den aktuellen Generatorstatus in ein Array von nur 59 Indizes zu speichern und zu laden. Es ist besser, es auf diese Weise zu machen, anstatt wie einige andere Kommentare zu "Iterieren x Mal, um den Zustand manuell wiederherzustellen. Dies ist eine schlechte Idee, weil in RNG schwere Spiele Ihre Random Generator-Zustand theoretisch in die Milliarden von Anrufen kommen könnte Das bedeutet, dass Sie - nach ihnen - eine Milliarde Mal iterieren müssen, um den Zustand der letzten Spielsitzung bei jedem Start wiederherzustellen. Zugegeben, das mag zwar nur eine Sekunde dauern, aber es ist meiner Meinung nach immer noch zu dreckig wenn Sie einfach den aktuellen Zustand des Zufallsgenerators extrahieren und ihn bei Bedarf neu laden könnten und nur 1 Array (59 Speicherindizes) aufnehmen.

Das ist nur eine Idee, also nimm von meinem Code, was du willst.

Hier ist die vollständige Quelle, die viel zu groß ist, um hier zu posten:

GrimoireRandom.cs

Und für jeden, der nur die Implementierung für die Frage will, werde ich es hier posten.

%Vor%

Mein Code ist neben der DiceType-Enumeration und der OpenTK Vector3-Struktur vollständig eigenständig. Beide Funktionen können einfach gelöscht werden und es funktioniert für Sie.

    
Krythic 15.09.2017 14:13
quelle
-3

Speichern Sie, wie oft der Zufallszahlengenerator lief, wie Xi Huan wrote.

Wiederholen Sie den Vorgang, um den alten Zustand wiederherzustellen.

%Vor%

Mach jetzt einfach

%Vor%

Es gibt keine Möglichkeit, diese Schleife zu durchlaufen, um dorthin zurückzukehren, wo Sie aufgehört haben.

    
SSpoke 22.10.2013 08:28
quelle

Tags und Links