sicp.io
3.1.3 · Псевдослучайное состояние

Начальное значение и воспроизводимость вывода

Генератор хранит закрытое начальное значение и заменяет его при каждом вызове, но с того же значения выдает ту же последовательность.

Вопрос для размышления

Как генератор с состоянием может менять значение при каждом вызове, но при этом в точности повторять последовательность?

  • Рассмотрение текущего значения seed как отдельной закрытой изменяемой ячейки
  • Отслеживание рекуррентного соотношения от одного сгенерированного значения к следующему
  • Различение детерминированной псевдослучайности и внешней случайности
  • Воспроизведение последовательности путем создания генератора с тем же значением seed

Процедура make-rand замыкает связывание seed. Каждый вызов умножает текущее значение на 48271, берет остаток по модулю 2147483647, сохраняет этот результат обратно в seed и возвращает его. Поэтому следующий вызов начинается со значения, полученного при предыдущем вызове.

Рекуррентное соотношение является детерминированным. Два раздельно созданных генератора начинают работу с закрытыми ячейками, однако одинаковые начальные значения seed делают их последовательности значений одинаковыми. Этот генератор урока делает состояние и воспроизводимость непосредственно наблюдаемыми.

Код SICP192 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Первая программа возвращает (48271 182605794 1291394886 1914720637 2078669041). Вторая программа возвращает (337897 1278240558 337897 1278240558).

    На что обратить внимание в трассе

    Найдите каждый set! для захваченного seed и проследите за сохраненным результатом до следующего вызова. Во второй программе разделите два окружения замыканий, даже если их первое и второе значения совпадают.

    Попробуйте сами

    Измените программу и сравните результат.

    Измените значение seed только у правого генератора с 7 на 8. Предскажите, какие позиции все еще могут совпасть, перед запуском программы.

    Показать подсказку

    Два генератора имеют независимые ячейки. Одинаковые рекуррентные соотношения воспроизводят последовательность только тогда, когда их начальные значения seed равны.

    Завершить этот урок

    В этой главе пройдено 0 из 21 урока0%