Python 使PRNG在软件之间达成一致
我正在调查是否有可能让两套软件在生成的伪随机数序列上达成一致。我对理解所有可能的分歧点很感兴趣,就像我在寻找一种让他们同意的方法一样 为什么?我在一家数据商店工作,它使用许多不同的软件包(Stata、R、Python、SAS,可能还有其他软件包)。最近,人们对通过用另一种语言复制过程来对输出进行QCing产生了兴趣。对于任何涉及随机数的过程,如果我们能够提供一系列步骤(“设置此选项”,等等),让两个包达成一致,这将是非常有帮助的。如果这不可行,我希望能够清楚地说明故障点在哪里 一个简单的例子: R和Python的默认随机数生成器都是Mersenne Twister。我把它们放在同一个种子上,试着从中取样,同时观察PRNG的“状态”。两种价值观都不一致 R(3.2.3,64位): Python(3.5.1,64位):Python 使PRNG在软件之间达成一致,python,r,random,Python,R,Random,我正在调查是否有可能让两套软件在生成的伪随机数序列上达成一致。我对理解所有可能的分歧点很感兴趣,就像我在寻找一种让他们同意的方法一样 为什么?我在一家数据商店工作,它使用许多不同的软件包(Stata、R、Python、SAS,可能还有其他软件包)。最近,人们对通过用另一种语言复制过程来对输出进行QCing产生了兴趣。对于任何涉及随机数的过程,如果我们能够提供一系列步骤(“设置此选项”,等等),让两个包达成一致,这将是非常有帮助的。如果这不可行,我希望能够清楚地说明故障点在哪里 一个简单的例子:
老问题,但可能对未来的读者有用:正如评论中提到的,最好的办法是自己实现这一点,并为不同的环境提供接口,以便为给定的种子返回相同的结果。为什么这是必要的?您以“采样”为例。其中包括几个步骤
R_unif
,它在[0,1]中返回一个double。同样,如何生成这样的double是非常重要的。如果您需要其他分布函数(正态分布函数、指数分布函数等等),您会发现它们有很多不同的算法总的来说,在很多地方(细微的)差异都会潜移默化。为什么不自己实现一个标准算法呢?我知道,至少对于Python来说,RNG实现不会改变是没有保证的。事实上,它已经改变了;它过去使用Wichmann Hill,许多方法过去依赖于
random.random()
当他们真的不应该这样做的时候。(实际上,Python 2.7仍然存在误用random.random()
,这可能会导致一些误用。)我正要提出同样的建议——您可以将简单+快速移植到Python。
set.seed(20160201)
.Random.seed
sample(c(1, 2, 3, 4, 5))
import random
random.seed(20160201)
random.getstate()
random.sample([1, 2, 3, 4, 5], 5)