【问题标题】:Can I expect results using System.Random to be reproducible on all systems?我可以期望使用 System.Random 的结果在所有系统上都可以重现吗?
【发布时间】:2013-12-11 07:23:48
【问题描述】:

如果给定相同的种子,Haskell 的 System.Random 会给我所有系统、处理器架构和 Haskell 版本的相同结果吗?有没有一个承诺,这将在未来成立?

更具体地说,我可以期望它总是(过去和未来)返回相同的列表吗?

import System.Random
rs = randomRs (1, 2^31-1) (mkStdGen 1)

【问题讨论】:

  • 我很确定在任何地方都没有制定过这样的承诺,也没有充分的理由。如果你想要一个可复制的链,为什么不直接推出你自己的 PRNG?如果您基本上将它用作固定的无限列表,那么拥有这个本地似乎是明智的。您甚至可以将其设为RandomGen 的实例,因此它可以以与System.Random 工具完全相同的方式使用。
  • @leftaroundabout 我可以想到很多好的理由来保证一致的随机流;这里的讨论也是相关的:blog.ezyang.com/2011/05/haskell-not-pure-enough
  • 除非文档说有,否则可能没有。特别是对于非常大的数字或小数字(或具有很高精度的实数),不同的系统会以不同的方式舍入。这可能是可能的,但必须格外小心地进行编程,并且可能会使用专门为不丢失数据而设计的数字类型。不过,我不是科学计算或随机数生成器方面的专家。
  • @jberryman 当然有很多应用程序需要一致的随机流,但它们都在某种程度上与随机性的概念相矛盾。因此,将这种一致性作为默认保证是不合理的;事实上,我认为如果代码在没有明确说明的情况下做出如此容易破坏的假设(例如,如果您更改 split 操作的顺序)是有害的。
  • 谢谢@leftaroundabout!您想发布您的 cmets 作为答案以便我批准吗?

标签: haskell random


【解决方案1】:

伪随机数生成器的“种子”值是确定性的。这就是为什么mkStdGen 是一个纯函数的原因。如果您真的很担心,是的,最好不要依赖不属于库规范的不变量。实际上,我希望表明,在这种情况下,伪随机性与它无关——问题归结为没有特定机器类型的纯 Haskell 是否在不同平台上评估相同。

StdGen当前用 Int32s 实现。当然,可以从这些固定大小的整数中采样其他类型的数据,但随机数生成器本身仅使用与机器无关的数据类型。根据Integer 类源,舍入也不留给机器(C 整数类型也是如此)。与 flonum 不同,使用 fixnums 时,打破标准带来的性能优势不那么引人注目,而且程序正确性风险更大。

特别是从 StdGen 退后一步,强大的密码学需要一个强大的伪随机性标准——非故意的特定于架构的行为可能是一个主要的安全整体,而有意的特定于架构的行为基本上相当于编写、维护、并证明正确的多个生成器。如果额外的努力是值得的,那么它可能也值得宣传/记录。

最后,Hackage 上有许多伪随机数生成器(System.Random 不应该是最快或最安全的 AFIAK),如果针对加密用途的一个没有提供您想要的不变量,我会感到惊讶。

【讨论】:

  • 如果世界上存在多个安全 PRNG,则特定于系统的 PRNG 不是安全漏洞。
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多