f(g(x)) 一起或分开的结果不一致
Inconsistent results for f(g(x)) together or split up
在 在函数中设置随机种子的过程中,我遇到了一个奇怪的情况。考虑函数 f
和 g
,每个函数都设置随机种子,然后执行简单的随机化操作:
g <- function(size) { set.seed(1) ; runif(size) }
f <- function(x) { set.seed(2) ; x*runif(length(x)) }
因为每个函数都会设置随机种子,所以我希望每个函数在给定相同输入的情况下始终具有相同的 return 值。这意味着 f(g(2))
应该 return 与 x <- g(2) ; f(x)
相同。令我惊讶的是,情况并非如此:
f(g(2))
# [1] 0.1520975 0.3379658
x <- g(2)
f(x)
# [1] 0.04908784 0.26137017
这是怎么回事?
这是双缝R实验的一个例子。当 x 被观察时,它就像一个粒子;当未被观察到时,它就像一个波浪。看
g <- function(size) { set.seed(1) ; runif(size) }
f <- function(x) {set.seed(2) ; x*runif(length(x)) }
f2 <- function(x) {print(x); set.seed(2) ; x*runif(length(x)) }
f(g(2))
# [1] 0.1520975 0.3379658
x <- g(2)
f(x)
# [1] 0.04908784 0.26137017
f2(g(2))
# [1] 0.2655087 0.3721239
# [1] 0.04908784 0.26137017
x <- g(2)
f2(x)
# [1] 0.2655087 0.3721239
# [1] 0.04908784 0.26137017
我只是在哄你。 print
正在逼迫 x
。你可以明确地做到这一点
f <- function(x) {force(x); set.seed(2) ; x*runif(length(x)) }
x <- g(2)
f(x)
# [1] 0.04908784 0.26137017
但不是这个
f(force(g(2)))
# [1] 0.1520975 0.3379658
您的 f()
函数的 x
参数仅在函数内部实际使用时才计算。这意味着当您尝试计算 f(g(2))
.
时,set.seed(2)
在 执行 g()
函数之前被评估
> f(g(2))
[1] 0.1520975 0.3379658
基本上等同于:
> set.seed(2)
> set.seed(1)
> result <- runif(2)
> result*runif(length(result))
[1] 0.1520975 0.3379658
在 f
和 g
,每个函数都设置随机种子,然后执行简单的随机化操作:
g <- function(size) { set.seed(1) ; runif(size) }
f <- function(x) { set.seed(2) ; x*runif(length(x)) }
因为每个函数都会设置随机种子,所以我希望每个函数在给定相同输入的情况下始终具有相同的 return 值。这意味着 f(g(2))
应该 return 与 x <- g(2) ; f(x)
相同。令我惊讶的是,情况并非如此:
f(g(2))
# [1] 0.1520975 0.3379658
x <- g(2)
f(x)
# [1] 0.04908784 0.26137017
这是怎么回事?
这是双缝R实验的一个例子。当 x 被观察时,它就像一个粒子;当未被观察到时,它就像一个波浪。看
g <- function(size) { set.seed(1) ; runif(size) }
f <- function(x) {set.seed(2) ; x*runif(length(x)) }
f2 <- function(x) {print(x); set.seed(2) ; x*runif(length(x)) }
f(g(2))
# [1] 0.1520975 0.3379658
x <- g(2)
f(x)
# [1] 0.04908784 0.26137017
f2(g(2))
# [1] 0.2655087 0.3721239
# [1] 0.04908784 0.26137017
x <- g(2)
f2(x)
# [1] 0.2655087 0.3721239
# [1] 0.04908784 0.26137017
我只是在哄你。 print
正在逼迫 x
。你可以明确地做到这一点
f <- function(x) {force(x); set.seed(2) ; x*runif(length(x)) }
x <- g(2)
f(x)
# [1] 0.04908784 0.26137017
但不是这个
f(force(g(2)))
# [1] 0.1520975 0.3379658
您的 f()
函数的 x
参数仅在函数内部实际使用时才计算。这意味着当您尝试计算 f(g(2))
.
set.seed(2)
在 执行 g()
函数之前被评估
> f(g(2))
[1] 0.1520975 0.3379658
基本上等同于:
> set.seed(2)
> set.seed(1)
> result <- runif(2)
> result*runif(length(result))
[1] 0.1520975 0.3379658