在参考该语句时set.seed(),如果我没有明确地设置它,我可以在运行一些代码后获取种子吗?
我一直在重新运行一些代码(交互式地/在控制台上),其中包含一个随机化输入数据样本的函数(该函数是kohonen包的一部分).在玩了一段时间后看到各种输出(这是一个'不稳定'的问题),我注意到一个非常有趣的结果.我当然没有使用过set.seed(),但想知道在运行代码后我是否可以获得种子以重现结果?
在?set.seed我看来
.Random.seed保存统一随机数生成器的种子集
但我不知道这有多大帮助.
Hon*_*Ooi 34
如果你没有保留种子,那么在观察随机抽取后,没有通用的方法可以将随机数生成器"回滚"到之前的状态.展望未来,您可能想要做的是保存.Random.seed计算结果的值.像这样的东西.
x <- .Random.seed
result <- <your code goes here>
attr(result, "seed") <- x
Run Code Online (Sandbox Code Playgroud)
然后您可以按如下方式重置PRNG; result2应该是一样的result.
.Random.seed <- attr(result, "seed")
result2 <- <your code goes here>
Run Code Online (Sandbox Code Playgroud)
洪先生的上述回答很有力。对于快速而肮脏的解决方案,我只是重新执行整个脚本直到获得有趣的行为,我随机选择一个整数,将其打印出来,然后将其用作种子。如果我的特定运行有有趣的行为,我会注意到该种子:
eff_seed <- sample(1:2^15, 1)
print(sprintf("Seed for session: %s", eff_seed))
set.seed(eff_seed)
Run Code Online (Sandbox Code Playgroud)
小智 5
要添加到mpettis给出的答案中,如果您不想手动重新执行脚本(每次迭代生成新的随机种子),您可以执行以下操作:
# generate vector of seeds
eff_seeds <- sample(1:2^15, runs)
# perform 'runs' number of executions of your code
for(i in 1:runs) {
print(sprintf("Seed for this run: %s", eff_seeds[i]))
set.seed(eff_seeds[i])
# your code here
# don't forget to save your outputs somehow
}
Run Code Online (Sandbox Code Playgroud)
其中变量“runs”是一个正整数,表示您想要运行代码的次数。
通过这种方式,您可以快速生成大量输出,并为每次迭代提供单独的种子以实现可重复性。