Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使PRNG在软件之间达成一致_Python_R_Random - Fatal编程技术网

Python 使PRNG在软件之间达成一致

Python 使PRNG在软件之间达成一致,python,r,random,Python,R,Random,我正在调查是否有可能让两套软件在生成的伪随机数序列上达成一致。我对理解所有可能的分歧点很感兴趣,就像我在寻找一种让他们同意的方法一样 为什么?我在一家数据商店工作,它使用许多不同的软件包(Stata、R、Python、SAS,可能还有其他软件包)。最近,人们对通过用另一种语言复制过程来对输出进行QCing产生了兴趣。对于任何涉及随机数的过程,如果我们能够提供一系列步骤(“设置此选项”,等等),让两个包达成一致,这将是非常有帮助的。如果这不可行,我希望能够清楚地说明故障点在哪里 一个简单的例子:

我正在调查是否有可能让两套软件在生成的伪随机数序列上达成一致。我对理解所有可能的分歧点很感兴趣,就像我在寻找一种让他们同意的方法一样

为什么?我在一家数据商店工作,它使用许多不同的软件包(Stata、R、Python、SAS,可能还有其他软件包)。最近,人们对通过用另一种语言复制过程来对输出进行QCing产生了兴趣。对于任何涉及随机数的过程,如果我们能够提供一系列步骤(“设置此选项”,等等),让两个包达成一致,这将是非常有帮助的。如果这不可行,我希望能够清楚地说明故障点在哪里

一个简单的例子:

R和Python的默认随机数生成器都是Mersenne Twister。我把它们放在同一个种子上,试着从中取样,同时观察PRNG的“状态”。两种价值观都不一致

R(3.2.3,64位):

Python(3.5.1,64位):


老问题,但可能对未来的读者有用:正如评论中提到的,最好的办法是自己实现这一点,并为不同的环境提供接口,以便为给定的种子返回相同的结果。为什么这是必要的?您以“采样”为例。其中包括几个步骤

  • 播种是一个不平凡的过程。例如,R可以延伸到所提供的种子。因此,除非用户工具使用相同的方法,否则即使用户提供相同的值,它们最终也会得到不同的种子

  • 实际的RNG:即使在这两种情况下都可能使用Mersenne Twister,但它真的与使用的版本相同吗?R使用32位MT。Python可能使用64位版本

  • 大多数RNG给您一个无符号整数(现在通常是32或64位)。但您需要一些随机数的分布,例如,对于采样,您需要给定范围内的随机整数。从RNG产生的整数到采样所需的整数,需要进行转换。在R的情况下,您甚至无法访问RNG的输出值。最基本的函数是
    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)