Отсутствие случайности YAP Prolog random

При выполнении следующей программы на Прологе с 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, то вывод каждый раз разный, т.е. случайный.

Кто-нибудь может это объяснить?


person S0rin    schedule 08.10.2015    source источник


Ответы (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)),

может работать

person CapelliC    schedule 08.10.2015

Перво-наперво!

По многим веским причинам (самой важной из которых является воспроизводимость прошлых результатов) компьютерные программы работают не с настоящими случайными числами, а с псевдослучайными числами.

PRNG — это полностью детерминированные функции, которые, учитывая то же самое внутреннее состояние (также известное как «начальное число»), что и инициализация, производят точно такую ​​же последовательность чисел (с этого момента и до вечности).

Быстрое решение: найдите подходящее начальное число (дата, время, фаза луны и т. д.) и явно инициализируйте PRNG этим начальным числом. Запишите начальное значение, чтобы позже вы могли детерминировано повторно запустить прошлые эксперименты.

person repeat    schedule 08.10.2015
comment
Наиболее важной причиной является не воспроизводимость прошлых результатов, а тот факт, что вы не можете найти источник случайных чисел с оборудованием, поставляемым с текущими компьютерами. - person gusbro; 08.10.2015
comment
@гусбро. Я не согласен. На самом деле всегда было доступно несколько вариантов, но они использовались только тогда, когда реальная случайность обязательна; обычно они подключаются к некоторому стохастическому физическому процессу, используя данные датчиков (см. serverfault.com/questions/214605/gpg-not-enough-entropy); несколько лет назад процессоры Intel 64 получили аппаратную поддержку, доступную с помощью расширения набора инструкций RdRand (см. en.m.wikipedia.org/wiki/RdRand). - person repeat; 09.10.2015
comment
Несколько лет назад у процессоров не было этих инструкций, а у типичного компьютера не было этих датчиков (звуковая карта, высокочастотный счетчик и т. Д. - не лучшие источники для выборки). - person gusbro; 09.10.2015
comment
@гусбро. Фактически правильно, с исторической точки зрения! Однако первоначально я пытался подчеркнуть следующее: даже если истинная случайность доступна бесплатно, недетерминизм, который она обеспечивает, является активом только для небольшого числа избранных приложений, таких как генерация открытые ключи в криптографии, моделирование в стиле Монте-Карло, неполное массово-параллельное исследование пространства поиска (без необходимости динамического разделения и координации во избежание дублирования работы). - person repeat; 09.10.2015