首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中,如何使PRNG在平台之间给出相同的浮点数?

在R中,如何使PRNG在平台之间给出相同的浮点数?
EN

Stack Overflow用户
提问于 2021-10-28 22:56:15
回答 1查看 170关注 0票数 6

在R4.1.1中运行以下代码会给出不同平台之间的不同结果。

代码语言:javascript
复制
set.seed(1)
x <- rnorm(3)[3]
print(x, 22)

# -0.83562861241004716      # intel windows
# -0.8356286124100471557341 # m1 mac

print(round(x, 15), 22)
# -0.83562861241004704      # intel windows
# -0.8356286124100470447118 # m1 mac

我知道差异的大小低于.Machine$double.eps,而额外的数字不包含有意义的信息。

我对存在额外数字这一事实并不满意。如何确保结果准确一致?是否有一个RNG库可以实现这一点?

编辑:

位表示是不同的。

代码语言:javascript
复制
set.seed(1)
x <- rnorm(100)
x <- sum(x)
SoDA::binaryRep(x)

.10101110001110000100001111110111000010011001011111011 # intel windows
.10101110001110000100001111110111000010011001011111110 # m1 mac

runif()中,位也是不同的。这表明,均匀高斯转换并不是唯一的临界点。

代码语言:javascript
复制
set.seed(1)
x <- runif(10000000)
x <- sum(x)
SoDA::binaryRep(x)

# kind = "Mersenne-Twister"
.10011000100101000110100110111100101000100000101100000 # intel windows
.10011000100101000110100110111100101000011111001100000 # m1 mac
# kind = "Wichmann-Hill"
.10011000100111111110101000100001001001010100000011011 # intel windows
.10011000100111111110101000100001001001010100001001010 # m1 mac
# kind = "Marsaglia-Multicarry"
.10011000100011100110000010000001011100011110100001110 # intel windows
.10011000100011100110000010000001011100011110001010000 # m1 mac
# kind = "Super-Duper"
.10011000100010011010010110100001000101100011101011110 # intel windows
.10011000100010011010010110100001000101100100001111101 # m1 mac
# kind = "Knuth-TAOCP-2002"
.10011000101000110101010111000111010011101001000101100 # intel windows
.10011000101000110101010111000111010011101001000101101 # m1 mac
# kind = "Knuth-TAOCP"
.10011000100110001011010011000001011001001110011111000 # intel windows
.10011000100110001011010011000001011001001110011111001 # m1 mac
# kind = "L'Ecuyer-CMRG"
.10011000100100010110100101101001011000000111010110101 # intel windows
.10011000100100010110100101101001011000001000010100001 # m1 mac
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-22 22:46:15

(10月29日和11月2日的评论搬到这里进行编辑。)

我应该指出,当涉及浮点算法时,这种带有伪随机数生成器(PRNG)的微妙的可重现性问题可能会发生。例如,英特尔的指令集架构可能会使用80位扩展精度的内部算法.然而,扩展的精度仅仅是浮点算法可能导致不可复制的伪随机数的一种方法(在许多其他方法中)。考虑到英特尔和Arm的指令集架构是不同的,足以引起可重现性问题。(如果我理解的话,Arm指令集就是苹果M1芯片中使用的。)

相比之下,整数算法的可重现性问题较少。

因此,如果点对点可再现性对您很重要,您应该尝试找到只使用整数操作的R语言PRNG。(实际上,计算机通过整数生成伪随机浮点数,而不是相反,大多数PRNGs生成整数,而不是浮点数。)

例如,对于统一变量,取Mersenne算法的整数输出,而不对其进行操作。对于高斯(和指数)随机变量,幸运的是,有一个Karney算法生成任意精度的变量,只使用整数操作。另外,考虑构建在底层整数操作上的rational算法。

参考资料:

Karney,C.F.F.,2016年。从正态分布中抽取样本。ACM关于数学软件的交易(TOMS),第42(1)页,第1-14页。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69761837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档