Existe-t-il un moyen de stocker l'état actuel du générateur de nombres pseudo-aléatoires intégré dans Perl de sorte que lorsque mon programme est exécuté à nouveau, il peut reprendre la séquence là où elle l'avait laissée?Comment puis-je stocker l'état du générateur pseudo-aléatoire dans Perl?
En ce moment, je stocke où je suis, ainsi que la graine initiale puis jeter le segment initial que je l'ai déjà vu en utilisant quelque chose de similaire à:
sub consume_upto_n {
my ($seed, $n) = @_;
$n = 1 unless defined $n and $n >= 1;
srand $seed;
rand for 1 .. $n - 1;
return;
}
Par exemple:
srand 0x18;
my @v = map { rand } 1 .. 5;
plus tard:
consume_upto_n(0x18, 3);
my @z = map { rand } 3 .. 5;
Ensuite, $z[0] == $v[2]
, $z[1] == $v[3]
etc.
@cjm Ceci est à des fins de simulation. Dites que j'ai une simulation qui nécessite 10 000 tirages. La qualité du générateur de nombres aléatoires n'a pas beaucoup d'importance mais la possibilité de répliquer (pour n'importe quelle combinaison de versions d'application 'perl' + OS +) une séquence donnée est importante. Je veux pouvoir l'interrompre au milieu et reprendre d'où nous nous sommes arrêtés. De cette façon, je peux répliquer la séquence exacte des événements plus tard en stockant simplement la graine initiale. –
Sinan: Il y a plusieurs choses que vous demandez: Pouvoir continuer la séquence à un point arbitraire et être capable de redémarrer exactement le même point. Les deux peuvent être faites en utilisant l'un des modules Math :: Random :: * mais à partir d'une inspection rapide des sources perl, cela ne peut pas être (facilement) fait avec le rand intégré() même à partir de XS! (Perl peut appeler rand() dans la bibliothèque c (et l'implémentation semble dépendant de la plate-forme.) – tsee
@cjm et @tsee Il est préférable de ne pas avoir à se fier au 'rand' intégré de toute façon. –