在函数闭包中自包含 RNG 种子

Self contained seeding of RNG in a function closure

提问人:Alex 提问时间:8/14/2023 更新时间:8/14/2023 访问量:38

问:

有没有办法设置一个“局部”种子,以便闭包中随机数生成器的使用只取决于这个种子?

例如

tmp_fn_test_seed <- function(seed) {
    
    set.seed(seed)
    
    function() {
        runif(1)
    }
}

以下序列不会产生相同的结果:

tmp_fn_test_seed_1 <-
    tmp_fn_test_seed(1000)
tmp_fn_test_seed_2 <- 
    tmp_fn_test_seed(1000)

tmp_fn_test_seed_1()
tmp_fn_test_seed_2()

相反,我得到:

> tmp_fn_test_seed_1()
[1] 0.3278787
> tmp_fn_test_seed_2()
[1] 0.7588465
r 闭包 随机种子

评论

3赞 MrFlick 8/14/2023
也许 withr::with_seed 函数可以提供帮助

答:

2赞 Roland 8/14/2023 #1

这样的事情对你有用吗?

tmp_fn_test_seed <- function(seed) {
  function() {
    old.seed <- .Random.seed
    on.exit(.GlobalEnv$.Random.seed <- old.seed)
    set.seed(seed)
    runif(1)
  }
}

tmp_fn_test_seed_1 <-
  tmp_fn_test_seed(1000)
tmp_fn_test_seed_2 <- 
  tmp_fn_test_seed(1000)

r1 <- .Random.seed
tmp_fn_test_seed_1()
#[1] 0.3278787
r2 <- .Random.seed
tmp_fn_test_seed_2()
#[1] 0.3278787
r3 <- .Random.seed

#"global" RNG state doesn't change 
all.equal(r1, r2)
all.equal(r1, r3)

评论

1赞 Limey 8/14/2023
有关函数与等的讨论,请参阅此页面withron.exit
0赞 Alex 8/14/2023
withr看起来不错。我将不得不阅读更多关于它的信息。我也对这个答案投了赞成票。