我正在研究是否有可能让两组软件就生成的伪随机数序列达成一致。我对理解所有可能的分歧点感兴趣,就像我对真正找到一种方法让他们达成一致一样感兴趣。
Why?我在一家使用许多不同软件包(Stata、R、Python、SAS,可能还有其他软件包)的数据商店工作。最近,人们对通过用另一种语言复制流程来控制输出产生了兴趣。对于任何涉及随机数的过程,如果我们可以提供一系列允许两个包达成一致的步骤(“设置此选项”等),将会很有帮助。如果这不可行,我希望能够阐明失败点在哪里。
一个简单的例子:
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)
老问题,但可能对未来的读者有用:正如评论中提到的,最好的选择是自己实现这个并为不同的环境提供接口,以便对于给定的种子返回相同的结果。为什么有必要?您使用“采样”作为示例。涉及几个步骤。
播种是一个不平凡的过程。例如,R 可以达到进一步争夺提供的种子。因此,除非您的用户工具使用相同的方法,否则即使用户提供相同的值,它们最终也会得到不同的种子。
实际的 RNG:即使在这两种情况下都可能使用 Mersenne-Twister,但它真的是相同的版本吗? R 使用 32 位 MT。也许 Python 使用 64 位版本?
大多数 RNG 为您提供无符号整数(现在通常为 32 或 64 位)。但是您将需要一些随机数的分布,例如为了进行采样,您需要给定范围内的随机整数。有很多方法从 RNG 生成的整数到采样所需的整数。对于 R,您甚至无法访问 RNG 的输出值。最基本的功能是R_unif
它返回 [0, 1) 中的双精度值。同样,如何生成这样的双精度数是没有得到普遍同意。如果您需要其他分布函数(正态、指数等),您会发现很多不同的算法。
总体而言,在很多地方都可能出现(微妙的)差异。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)