Gibt es eine Möglichkeit, den aktuellen Zustand des eingebauten Pseudozufallszahlengenerators in Perl zu speichern, so dass, wenn mein Programm erneut ausgeführt wird, es die Sequenz von dort wieder aufnehmen kann, statt mit einer neuen Sequenz zu beginnen?Wie kann ich den Zustand des Pseudozufallsgenerators in Perl speichern?
Gerade jetzt, ich bin zu speichern, wo ich als auch die anfängliche Samen bin und dann das Anfangssegment Wegwerfen, die ich schon etwas mit ähnlich gesehen haben:
sub consume_upto_n {
my ($seed, $n) = @_;
$n = 1 unless defined $n and $n >= 1;
srand $seed;
rand for 1 .. $n - 1;
return;
}
Zum Beispiel:
srand 0x18;
my @v = map { rand } 1 .. 5;
Später:
consume_upto_n(0x18, 3);
my @z = map { rand } 3 .. 5;
Dann $z[0] == $v[2]
, $z[1] == $v[3]
usw.
@cjm Dies ist für Simulationszwecke. Angenommen, ich habe eine Simulation, die 10.000 Züge erfordert. Die Qualität des Zufallszahlengenerators spielt keine große Rolle, aber die Fähigkeit, eine gegebene Sequenz zu reproduzieren (für jede Kombination aus Perl + OS + App-Version), ist wichtig. Ich möchte es in der Mitte unterbrechen und von dort wieder aufnehmen können, wo wir aufgehört haben. Auf diese Weise kann ich später die genaue Abfolge von Ereignissen replizieren, indem ich einfach den Anfangssamen speichere. –
Sinan: Es gibt mehrere Dinge, nach denen du fragst: Die Sequenz an einem beliebigen Punkt fortsetzen zu können und genau denselben Punkt neu starten zu können. Beides kann mit einem der Math :: Random :: * Module geschehen, aber aus einer kursorischen Betrachtung der Perl-Quellen kann dies nicht (einfach) mit dem eingebauten rand() selbst aus XS heraus geschehen! (Perl kann den rand() der c library als Teil seines rand() aufrufen und die Implementierung scheint plattformabhängig zu sein.) – tsee
@cjm und @tsee Es ist besser, sich nicht auf den eingebauten 'rand' zu verlassen. –