4

使用 YAP 执行以下 Prolog 程序时,输出始终相同,即整数 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 重复这个过程,那么每次的输出都是不同的,即随机的。

谁能解释一下?

4

2 回答 2

4

最重要的事情!

由于许多充分的理由(过去结果的可重复性是最重要的一个),计算机程序不能使用实际随机数,而是使用随机数。

PRNG 是完全确定的函数,给定与初始化相同的内部状态(也称为“种子”),产生完全相同的数字序列(从现在到永恒)。

快速修复:为自己找到一个合适的种子(日期、时间、月相……)并用该种子显式初始化 PRNG。记录种子,以便您以后可以确定地重新运行过去的实验。

于 2015-10-08T17:28:46.110 回答
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)),

可以工作

于 2015-10-08T17:22:44.127 回答