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 этим семенем. Запишите начальное значение, чтобы впоследствии можно было детерминистически повторить прошедшие эксперименты.

Другие вопросы по тегам