【问题标题】:Inconsistent results for f(g(x)) together or split upf(g(x)) 的结果不一致或分开
【发布时间】:2015-09-14 01:26:41
【问题描述】:

a recent investigation 在函数中设置随机种子期间,我遇到了一个奇怪的情况。考虑函数fg,它们分别设置随机种子,然后执行简单的随机操作:

g <- function(size) { set.seed(1) ; runif(size) }
f <- function(x) { set.seed(2) ; x*runif(length(x)) }

因为每个函数都设置随机种子,所以我希望每个函数在给定相同输入的情况下始终具有相同的返回值。这意味着f(g(2)) 应该返回与x &lt;- g(2) ; f(x) 相同的内容。令我惊讶的是,情况并非如此:

f(g(2))
# [1] 0.1520975 0.3379658

x <- g(2)
f(x)
# [1] 0.04908784 0.26137017

这是怎么回事?

【问题讨论】:

    标签: r random random-seed


    【解决方案1】:

    这是双缝 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
    

    【讨论】:

    • 哈哈。 R中的双缝实验!惰性评估作为 QM。完美。
    • 很好地使用josliber 作为动词。
    • @JosephWood 我认为所有的赞成票都是为了这个
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2017-04-14
      • 2010-09-08
      • 1970-01-01
      • 2011-07-11
      • 2021-09-25
      相关资源
      最近更新 更多