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

问题描述 投票:0回答:1

有没有办法设置“本地化”种子,以便闭包内随机数生成器的使用仅取决于该种子?

例如

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 random closures random-seed
1个回答
0
投票

问题中的函数工厂没有在它返回的函数中设置种子。返回值与工厂的参数无关。
解决方案是强制进行种子评估,并在返回的函数中设置已评估的(不再是承诺)种子值。

tmp_fn_test_seed <- function(seed) {
  force(seed)
  function() {
    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)


tmp_fn_test_seed_1()
#> [1] 0.3278787
tmp_fn_test_seed_2()
#> [1] 0.3278787

# check result
set.seed(1000)
runif(1)
#> [1] 0.3278787

创建于 2023-08-14,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.