打印当前随机种子,以便稍后可以使用set.seed()输入它

Joe*_*moe 19 random r

我是R新手.

假设我有代码行

set.seed(123456)
Run Code Online (Sandbox Code Playgroud)

然后我想得到值123456所以我可以打印出来用于文档目的,如果需要在将来某个时候重新输入值.那我怎么得到那粒子?

请注意,我可以将上面的代码行注释掉,所以我实际上不会知道种子在123456处是什么.因此我需要r将当前种子的位置打印为单个整数,而不是列表626整数.

Ben*_*ker 25

使用的种子set.seed()和信息之间实际上存在单向关系.Random.seed; 如?Random.seed说和@ MattTenenbaum的回答显示,信息.Random.seed可以被保存和恢复.我很欣赏一个函数的愿望,它可以从当前状态派生出一个简单的整数种子.Random.seed,但是在它缺席的情况下,你必须保存并恢复完整的信息...例如

set.seed(1001)
save(".Random.seed",file="random_state_seed1001.RData") ## save current state
runif(1)
## [1] 0.9856888
runif(1)
## [1] 0.4126285
runif(1)
## [1] 0.4295392
load("random_state_seed1001.RData") ## restore state just after set.seed()
runif(1)
## [1] 0.9856888
Run Code Online (Sandbox Code Playgroud)

正如@JoshuaUlrich所指出的那样,只有在保存和恢复之间不修改RNG的类型(以及正常偏差发生器的类型)时,这才有效.

更完整的解决方案:

save_rng <- function(savefile=tempfile()) {
    if (exists(".Random.seed"))  {
        oldseed <- get(".Random.seed", .GlobalEnv)
    } else stop("don't know how to save before set.seed() or r*** call")
    oldRNGkind <- RNGkind()
    save("oldseed","oldRNGkind",file=savefile)
    invisible(savefile)
}

restore_rng <- function(savefile) {
    load(savefile)
    do.call("RNGkind",as.list(oldRNGkind))  ## must be first!
    assign(".Random.seed", oldseed, .GlobalEnv)
}
Run Code Online (Sandbox Code Playgroud)

试试看:

set.seed(101)
RNGstore <- save_rng()  ## save file name
runif(1)
## [1] 0.3721984
runif(10)
## [1] 0.04382482 0.70968402 0.65769040 0.24985572 0.30005483 0.58486663
## [7] 0.33346714 0.62201196 0.54582855 0.87979573
restore_rng(RNGstore)
runif(1)
## [1] 0.3721984
Run Code Online (Sandbox Code Playgroud)

另见:http://www.cookbook-r.com/Numbers/Saving_the_state_of_the_random_number_generator/