我可以期望使用System.Random的结果可以在所有系统上重现吗?

Jon*_*lus 5 random haskell

鉴于相同的种子,Haskell的System.Random会为所有系统,处理器架构和Haskell版本提供相同的结果吗?是否有承诺,这将在未来举行?

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

import System.Random
rs = randomRs (1, 2^31-1) (mkStdGen 1)
Run Code Online (Sandbox Code Playgroud)

Eri*_*314 0

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

StdGen目前使用 Int32 实现。当然,可以从这些固定大小的整数中采样其他类型的数据,但随机数生成器本身仅使用与机器无关的数据类型。根据Integer类源代码,舍入也不由机器决定(对于 C 整数类型也是如此)。与 flonum 不同,fixnum 因违反标准而带来的性能优势不太明显,但程序正确性风险却大得多。

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

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