Как правильно посеять случайную функцию в схеме?

После запуска Схемы у меня сложилось впечатление, что randomize процедура была вызвана с текущим временем в качестве его начального числа. Однако, если у меня есть скрипт Scheme, состоящий исключительно из (print (random 10)), единственный вывод, который я получаю, 7; другого номера нет. Итак, что я делаю не так? Для записи я использую Chicken Scheme.

1 ответ

Решение

Какую случайную библиотеку вы используете, точно? согласно документации ваше предположение о randomпосев правильный

(randomize [SEED]): Установить случайное число семян. Если SEED (точное целое число) не указано, используется текущее время. При запуске (когда инициализируются дополнительные устройства) генератор случайных чисел инициализируется с текущим временем.

(random N): Возвращает псевдослучайное целое число в [0, N-1]. N является целым числом.

Также обратите внимание на предупреждения, в частности второе, которое, кажется, объясняет поведение, которое вы наблюдаете:

Предупреждение: эта процедура использует rand(3) для внутреннего использования и имеет свои недостатки, включая низкое качество псевдослучайности:

  • В Windows и Solaris можно генерировать только 32768 уникальных случайных значений в диапазоне [0, N-1]. Если N >= 32768, в наборе результатов будут пропуски.
  • В Mac OS X, Windows и некоторых других платформах наблюдается небольшая разница в выводе с соседними семенами. Поскольку генератор случайных чисел при запуске заполняется текущими секундами, новые процессы могут видеть похожие или идентичные случайные последовательности в течение одной минуты.
  • В Linux rand(3) является псевдонимом random(3), который обеспечивает вывод приемлемого качества.
Другие вопросы по тегам