Как сохранить состояние псевдослучайного генератора в 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
).
Я не совсем уверен, в чем дело. Если это достаточно случайная последовательность, как вы можете определить, продолжаете ли вы эту последовательность или начинаете новую?