【发布时间】: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 作为答案以便我批准吗?