Как сохранить состояние псевдослучайного генератора в Perl?

Есть ли способ сохранить текущее состояние встроенного генератора псевдослучайных чисел в Perl, так что, когда моя программа будет запущена снова, она может выбрать последовательность, от которой она остановилась, а не начать с новой последовательности

Сейчас я храню, где я, а также начальное семя, а затем выбрасываю начальный сегмент, который я уже видел, используя что-то похожее на:

sub consume_upto_n {
    my ($seed, $n) = @_;
    $n = 1 unless defined $n and $n >= 1;
    srand $seed;
    rand for 1 .. $n - 1;
    return;
}

Например:

srand 0x18;
my @v = map { rand } 1 .. 5;

Далее:

consume_upto_n(0x18, 3);
my @z = map { rand } 3 .. 5;

Затем $z[0] == $v[2], $z[1] == $v[3] и т.д.

Ответ 1

От perl 5.13.4, srand возвращает семя:

srand() теперь возвращает семя

Это позволяет программам, которые должны иметь повторяющиеся результаты, чтобы не создавать собственный механизм генерации семян. Вместо этого они могут использовать srand() и как-то зачерпнуть возврат для будущего использования. Типичным является тестовая программа, в которой слишком много комбинаций для всестороннего тестирования за время, доступное для каждого запуска. Он может каждый раз тестировать случайное подмножество, и если есть сбой, зарегистрируйте семя, используемое для этого прогона, чтобы впоследствии его можно было использовать для воспроизведения точных результатов.

Ответ 2

Я не думаю, что встроенный rand позволяет это сделать. Но вы можете использовать замену rand. Например, Math::Random::MT::Auto позволяет сериализовать свои объекты (предположительно включая $MRMA::PRNG, который является объектом, который используется его заменой rand).

Я не совсем уверен, в чем дело. Если это достаточно случайная последовательность, как вы можете определить, продолжаете ли вы эту последовательность или начинаете новую?