2010-03-02 5 views
10

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

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

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

6

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

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

+4

@cjm Это предназначение для моделирования. Скажем, у меня есть симуляция, которая требует 10 000 ничьих. Качество генератора случайных чисел не имеет большого значения, но возможность репликации (для любой данной комбинации perl + OS + app) важна данная последовательность. Я хочу быть в состоянии прервать его посередине и забрать с того места, где мы остановились. Таким образом, я могу повторить точную последовательность событий позже, просто сохранив начальное семя. –

+1

Синан: Есть много вещей, о которых вы просите: возможность продолжить последовательность в какой-то произвольной точке и возможность перезапуска одной и той же точки. Оба могут быть выполнены с использованием одного из модулей Math :: Random :: *, но из-за беглого осмотра источников perl это невозможно (легко) сделать с встроенным rand() даже с XS! (Perl может вызывать c библиотеку rand() как часть своего rand(), и реализация кажется зависимой от платформы.) – tsee

+0

@cjm и @tsee Лучше вообще не полагаться на встроенный 'rand'. –

 Смежные вопросы

  • Нет связанных вопросов^_^