YAP Пролог случайный отсутствие случайности
При выполнении следующей программы Prolog с YAP выходные данные всегда одинаковы, а именно целое число 233.
:- use_module(library(random)).
x:- random(1,1000,X), writeln(X).
Например, если я выполняю следующий скрипт bash, вывод всегда будет одним и тем же целым числом (233).
for k in `seq 0`
do
yap -l test.pl << %
x.
%
done
Если я повторю эту процедуру, используя swipl, то каждый раз вывод будет разным, то есть случайным.
Кто-нибудь может объяснить это?
2 ответа
Обычно для случайных генераторов требуется что-то вроде вызова set_seed(SomeReallyRandomValue), в C часто использовался seed(time(0)). Так что я думаю
datime(datime(_Year, _Month, _DayOfTheMonth, _Hour, Minute, Second)),
X is Minute * Second,Y=X,Z=X,
setrand(rand(X,Y,Z)),
может работать
Перво-наперво!
По многим веским причинам (воспроизводимость прошлых результатов является наиболее важной) компьютерные программы работают не с реальными случайными числами, а с псевдослучайными числами.
PRNG - это полностью детерминированные функции, которые при одинаковом внутреннем состоянии (то есть "семя"), что и инициализация, производят точно такую же последовательность чисел (от настоящего момента до вечности).
Быстрое решение: найдите себе подходящее семя (дата, время, фаза луны, ...) и явно инициализируйте PRNG этим семенем. Запишите начальное значение, чтобы впоследствии можно было детерминистически повторить прошедшие эксперименты.