YAP Prolog random 缺乏随机性
YAP Prolog random's lack of randomness
用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 重复这个过程,那么每次输出都是不同的,即随机的。
谁能解释一下?
通常,随机生成器需要类似 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 是完全确定的函数,给定与初始化相同的内部状态(a.k.a。"seed"),产生完全相同的数字序列(从现在到永恒)。
快速修复:为自己找到合适的种子(日期、时间、月相……)并使用该种子显式初始化 PRNG。记录种子,以便您以后可以确定性地重新 运行 过去的实验。
用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 重复这个过程,那么每次输出都是不同的,即随机的。
谁能解释一下?
通常,随机生成器需要类似 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 是完全确定的函数,给定与初始化相同的内部状态(a.k.a。"seed"),产生完全相同的数字序列(从现在到永恒)。
快速修复:为自己找到合适的种子(日期、时间、月相……)并使用该种子显式初始化 PRNG。记录种子,以便您以后可以确定性地重新 运行 过去的实验。