【问题标题】:YAP Prolog random's lack of randomnessYAP Prolog random 缺乏随机性
【发布时间】:2015-10-09 01:31:56
【问题描述】:

当用 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 重复这个过程,那么每次的输出都是不同的,即随机的。

谁能解释一下?

【问题讨论】:

    标签: random prolog random-seed yap


    【解决方案1】:

    首先要做的事!

    出于许多充分的原因(过去结果的可重复性是最重要的原因)计算机程序不能使用实际随机数,而是使用伪随机数。 p>

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

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

    【讨论】:

    • 最重要的原因不是过去结果的“可重复性”,而是由于当前计算机提供的硬件无法找到随机数的来源。
    • @gusbro。我不同意。事实上,有几个选项一直可用,但它们只在真正的随机性是必须时使用;通常,他们使用传感器数据进入一些随机物理过程(参见 serverfault.com/questions/214605/gpg-not-enough-entropy);几年前,英特尔 64 处理器通过使用指令集扩展“RdRand”(参见en.m.wikipedia.org/wiki/RdRand)获得了硬件支持。
    • 几年前 CPU 没有这些指令,典型的计算机也没有这些传感器(声卡、高频计数器等不是很好的采样来源)。
    • @gusbro。从历史的角度来看,事实是正确的!然而,我最初试图提出的观点是:即使“真正的”随机性免费可用,它所支持的非确定性只是少数选择应用程序的资产,例如密码学中的公钥生成、蒙特卡洛风格模拟、不完整的大规模并行搜索空间探索(无需动态分区和协调以避免重复工作)。
    【解决方案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)),
    

    可以工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多