Как я могу сохранить состояние генератора псевдослучайных в Perl? - PullRequest
10 голосов
/ 02 марта 2010

Есть ли способ сохранить текущее состояние встроенного генератора псевдослучайных чисел в 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] и т. Д.

Ответы [ 2 ]

6 голосов
/ 02 марта 2010

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

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

1 голос
/ 04 октября 2010

Начиная с perl 5.13.4 , srand возвращает семя :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...