Как правильно посеять случайную функцию в схеме?
После запуска Схемы у меня сложилось впечатление, что 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), который обеспечивает вывод приемлемого качества.