Как я могу использовать воспроизводимую рандомизацию в Perl? - PullRequest
2 голосов
/ 04 ноября 2010

У меня есть скрипт Perl, который использует rand для генерации псевдослучайных целых чисел в некотором диапазоне. Я хочу, чтобы он был случайным (т. Е. Не устанавливал для себя начальное значение какой-либо константы), но я также хочу иметь возможность воспроизводить результаты определенного запуска, если это необходимо.

Что бы вы сделали?

Ответы [ 5 ]

2 голосов
/ 04 ноября 2010

McWafflestix говорит:

Возможно, вы хотите иметь случайное начальное значение по умолчанию, которое при желании даст вам полную случайность, но которое можно установить до запуска вручную, чтобы обеспечить воспроизводимость.

Очевидный способ реализовать это - следовать обычному процессу заполнения (либо вручную из сильного случайного источника, либо позволить perl делать это автоматически при первом вызове rand), а затем использовать первыйгенерирует случайное значение в качестве начального числа и записывает его.Если вы хотите воспроизвести позже, просто используйте записанное значение для семян.

# something like this?

if ( defined $input_rand_seed ) {
    srand($input_rand_seed);
} else {
    my $seed = rand();   # or something fancier
    log_random_seed($seed);
    srand($seed);
}
1 голос
/ 04 ноября 2010

Если цель состоит в том, чтобы иметь возможность воспроизводить траектории симуляции, которые включают в себя случайные шоки (скажем, когда вы работаете с экономической моделью для составления прогнозов, я бы отказался от идеи сохранения начального числа, а скорее сохранил бы каждую последовательность вместе с данные модели.

Обратите внимание, что встроенная rand подвержена капризам реализации rand, предоставляемой средой выполнения C. На всех машинах Windows и во всех версиях perl, которые я использовал, это обычно означает, что rand будет когда-либо генерировать только 32768 уникальных значений .

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

Фактически, если вы собираетесь запускать симуляцию 1000 раз, я бы предварительно подготовил 1000 соответствующих случайных последовательностей, используя заведомо исправные генераторы, которые согласованы на разных платформах, и сохранил бы их вместе с входными данными модели.

Вы можете обновить моделирование, используя те же последовательности или новый набор, если оценки параметров изменяются при получении новых данных.

1 голос
/ 04 ноября 2010

Почему вы не хотите установить семя, но в то же время установить семя? Как я уже говорил вам ранее, вам нужно объяснить, почему вы не хотите что-то делать, чтобы мы знали, что вы на самом деле спрашиваете.

Вы можете установить его самостоятельно только при определенных условиях:

srand( $ENV{SOME_SEED} ) if defined $ENV{SOME_SEED};

Если вы не звоните srand, rand вызывает его для вас автоматически, но не сообщает о начальном числе, которое использовалось (по крайней мере, до Perl 5.14).

Это действительно простая проблема программирования. Просто включите то, что вы изложили в код, который делает то, что вы сказали.

1 голос
/ 04 ноября 2010

Записать начальное число для каждого запуска и предоставить метод для вызова сценария и установить начальное значение?

0 голосов
/ 04 ноября 2010

Ваши цели расходятся друг с другом.С одной стороны, вы хотите самосевную, совершенно случайную последовательность целых чисел;с другой стороны, вы хотите воспроизводимости.Абсолютно случайность и воспроизводимость противоречат друг другу.

Вы можете установить начальное значение на то, что вам нужно.Возможно, вы хотите иметь случайное начальное число по умолчанию, которое при желании даст вам полную случайность, но которое можно установить до запуска вручную, чтобы обеспечить воспроизводимость.

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