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.

Foi útil?

Solução 2

AS Perl 5.13.4, srand Retorna a semente:

srand() agora retorna a semente

Isso 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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top