在R4.1.1中运行以下代码会给出不同平台之间的不同结果。
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库可以实现这一点?
编辑:
位表示是不同的。
set.seed(1)
x <- rnorm(100)
x <- sum(x)
SoDA::binaryRep(x)
.10101110001110000100001111110111000010011001011111011 # intel windows
.10101110001110000100001111110111000010011001011111110 # m1 mac在runif()中,位也是不同的。这表明,均匀高斯转换并不是唯一的临界点。
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发布于 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页。
https://stackoverflow.com/questions/69761837
复制相似问题