【问题标题】:Pseudo random generators and platform dependency伪随机生成器和平台依赖性
【发布时间】:2015-04-20 14:43:24
【问题描述】:

我知道伪随机生成器是确定性的,即,当使用相同的种子时,它们会产生相同的输出序列。在实践中,只有当您使用相同的平台(即相同的硬件、操作系统等)时,这一切都是正确的。

我知道,但是,在某些情况下,当您在不同平台上运行相同的代码时,您可能会得到不同的答案(此处简要指出:How to generate a repeatable random number sequence?)。

作为另一个例子,本文在一些神经成像应用的背景下研究了这种差异的一些原因: http://journal.frontiersin.org/article/10.3389/fninf.2015.00012/abstract

我的问题是对于这种现象是否有一个有据可查的一般解释。任何其他指针表示赞赏。

换句话说,我关心的是在什么情况下会危及伪随机生成器的再现性?以及如何避免这些情况(并真正保证跨平台重现性)?

【问题讨论】:

  • “在实践中,只有当你在同一个平台上时,这一切都是正确的,即相同的硬件、操作系统等。” - 不确定这是否完全正确。这将取决于您的整体环境 - 例如 Java 将提供定义明确的 PRNG(通过提供者 spi 接口),可以跨平台正确重复,等等......
  • 所以我想“如何避免这些情况”的部分答案是选择具有明确定义的 PRNG 语义的开发环境!
  • 感谢 BadZen。您是否知道您的声明(Java 的 PRNG 语义被明确定义)被记录在某处?
  • Mahdi - 这有两个部分 - PRNG 作为比特流的实现,以及浮点运算的语义一旦你拥有它们。第一部分的文档位于docs.oracle.com/javase/7/docs/api/java/util/Random.html - 第二部分的文档位于en.wikipedia.org/wiki/Strictfp(介绍)和语言规范docs.oracle.com/javase/specs

标签: random cross-platform reproducible-research


【解决方案1】:

你很困惑。根据定义,PRNG 是完全确定的。它们不可能是其他的,因为它们运行在确定性硬件上。相同的算法在不同的机器上运行会产生相同的结果。

机器和操作系统的不同主要是因为它们使用不同的算法或不同的播种方法。如果您想要机器之间相同的 PRNG,只需自己编写它,这样您就知道它是相同的。

还有许多使用的非伪 RNG 或硬件设备和其他不确定的熵源:包括 /dev/random、random.org 等。如果您想要可重复性,请不要使用这些。如果您想要加密安全,请使用这些。

【讨论】:

  • 正如 OP 所说,他完全了解 PRNG 是如何工作的。如果您阅读他发布的论文,您会发现问题在于将伪随机比特流解释为浮点数。由于每个平台的浮点实现差异很大,因此这些包可能会在不同平台上产生不可重现的结果。
  • 正如 BadZen 提到的,我知道 PRNG 的想法。关键是在我提到的情况下,即使是相同的种子在不同的平台上也会产生不同的结果。
  • 是平台还是算法?我不知道有两个平台甚至声称具有相同的 PRNG,除非它是由语言指定的(例如 Python 或 Java)。
猜你喜欢
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 2020-03-02
  • 2014-05-18
  • 2018-05-20
  • 1970-01-01
  • 2015-08-07
  • 2012-02-12
相关资源
最近更新 更多