我是R的新手。
假设我有一行代码
set.seed(123456)
,然后我想要得到值123456,这样我就可以打印出来用于文档目的,如果需要的话,在将来的某个时候重新输入值。那我怎么得到种子呢?
请注意,我可能注释掉了上面的代码行,所以我实际上不知道123456处的种子是什么。因此,我需要r将当前种子的位置打印为单个整数,而不是一个包含626个整数的列表。
在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)
}
Try it out:
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/
一旦您调用了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
下面是一些在实践中应该工作得很好的东西(但不应该用于例如密码学):
new.seed <- as.integer(runif(1)*2e9)
cat("Random seed: ", new.seed, "n")
set.seed(new.seed)
您确实需要实际设置种子以使其工作,因此它不完全是原始问题的答案,但可能是您正在寻找的,因为它允许您轻松指定随机种子,而无需使用预先指定的整数手动设置。