有没有办法设置“本地化”种子,以便闭包内随机数生成器的使用仅取决于该种子?
例如
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
问题中的函数工厂没有在它返回的函数中设置种子。返回值与工厂的参数无关。
解决方案是强制进行种子评估,并在返回的函数中设置已评估的(不再是承诺)种子值。
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