19

我是这里的R新手。

假设我有这行代码

set.seed(123456)

然后我想获得值 123456 以便我可以将其打印出来以用于文档目的,如果需要在将来的某个时间重新输入该值。那么如何获得那颗种子呢?

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

4

3 回答 3

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

正如@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)
}

试试看:

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

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

于 2012-12-21T21:44:59.773 回答
3

调用set.seed后,您应该可以参考.Random.seed(有关更多信息,请参见http://stat.ethz.ch/R-manual/R-patched/library/base/html/Random.html)。

一个简单的例子:

set.seed(123)
tmp <- .Random.seed
> runif(10)
 [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055 0.8924190 0.5514350 0.4566147
.Random.seed <- tmp
> runif(10)
 [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055 0.8924190 0.5514350 0.4566147
于 2012-12-21T21:33:07.927 回答
3

这里有一些在实践中应该可以正常工作的东西(但不应该用于例如密码学):

new.seed <- as.integer(runif(1)*2e9)
cat("Random seed: ", new.seed, "\n")
set.seed(new.seed)

您确实需要实际设置种子才能使其正常工作,因此它不是原始问题的完全答案,但可能是您正在寻找的,因为它可以让您轻松指定随机种子,而无需使用预先指定的手动设置整数。

于 2014-12-27T22:37:52.640 回答