让PRNG同意跨软件

问题描述 投票:7回答:1

我正在研究是否有可能让两组软件就生成的伪随机数序列达成一致。我有兴趣了解所有可能的分歧点,因为我实际上找到了让他们同意的方法。

为什么?我在数据商店工作,使用许多不同的软件包(Stata,R,Python,SAS,可能还有其他软件包)。最近通过复制另一种语言的过程对QCing输出感兴趣。对于涉及随机数的任何过程,如果我们可以提供允许两个包同意的一系列步骤(“设置此选项”等)将会有所帮助。如果这不可行,我希望能够清楚地说明失败点在哪里。

一个简单的例子:

R和Python的默认随机数生成器都是Mersenne-Twister。我将它们设置为相同的种子并尝试从中进行采样,并查看PRNG的“状态”。两个价值都没有达成一致。

R(3.2.3,64位):

set.seed(20160201)
.Random.seed
sample(c(1, 2, 3, 4, 5))

Python(3.5.1,64位):

import random

random.seed(20160201)
random.getstate()
random.sample([1, 2, 3, 4, 5], 5)
python r random
1个回答
1
投票

老问题,但对未来的读者可能有用:正如评论中所提到的,最好的办法就是实现这个自我,并为不同的环境提供接口,这样对于给定的种子,返回相同的结果。为什么这有必要?您使用“采样”作为示例。涉及几个步骤。

  1. 播种是一个非平凡的过程。例如,R向further scramble提供所提供的种子。因此,除非您的用户工具使用相同的方法,否则即使用户提供相同的值,它们也会以不同的种子结束。
  2. 实际的RNG:尽管在两种情况下都可能使用Mersenne-Twister,但它使用的版本是否真的相同? R使用32位MT。也许Python使用64位版本?
  3. 大多数RNG为您提供无符号整数(现在通常为32或64位)。但是你需要一些随机数的分布,例如对于采样,您需要在给定范围内的随机整数。有many methods从RNG生成的整数到采样所需的整数。在R的情况下,您甚至无法访问RNG的输出值。最基本的函数是R_unif,它在[0,1]中返回一个double。再次,如何生成这样的双倍是not universally agreed on。如果你需要其他分布函数(正常,指数......),你会发现很多不同的算法。

总的来说,有很多地方(细微的)差异可能会蔓延。

© www.soinside.com 2019 - 2024. All rights reserved.