Como posso armazenar o estado do gerador pseudo-aleatom em Perl?
-
23-09-2019 - |
Pergunta
Existe uma maneira de armazenar o estado atual do gerador de números pseudo-aleatórios incorporado em Perl, para que, quando meu programa seja executado novamente, ele possa captar a sequência de onde parou em vez de começar com uma nova sequência?
No momento, estou armazenando onde estou e também a semente inicial e depois jogando fora o segmento inicial que eu já vi usando algo semelhante a:
sub consume_upto_n {
my ($seed, $n) = @_;
$n = 1 unless defined $n and $n >= 1;
srand $seed;
rand for 1 .. $n - 1;
return;
}
Por exemplo:
srand 0x18;
my @v = map { rand } 1 .. 5;
Mais tarde:
consume_upto_n(0x18, 3);
my @z = map { rand } 3 .. 5;
Então, $z[0] == $v[2]
, $z[1] == $v[3]
etc.
Solução 2
AS Perl 5.13.4, srand
Retorna a semente:
srand()
agora retorna a sementeIsso permite que programas que precisam ter resultados repetíveis para não precisar criar seu próprio mecanismo de geração de sementes. Em vez disso, eles podem usar
srand()
e de alguma forma esconder o retorno para uso futuro. Típico é um programa de teste que tem muitas combinações para testar de forma abrangente no tempo disponível a cada execução. Ele pode testar um subconjunto aleatório a cada vez e, caso haja uma falha, registre a semente usada para a execução para que ela possa ser usada posteriormente para reproduzir os resultados exatos.
Outras dicas
Eu não acho que o embutido rand
permite que você faça isso. Mas você pode usar um substituto rand
. Por exemplo, Math :: Random :: Mt :: Auto permite que você serialize seus objetos (presumivelmente incluindo $MRMA::PRNG
, que é o objeto que é usado por sua substituição rand
).
Não tenho muita certeza de qual é o ponto. Se é uma sequência razoavelmente aleatória, como você pode dizer se está continuando essa sequência ou iniciando uma nova?