我可以以某种方式获得.seed()吗?

a d*_*ben 42 r

在参考该语句时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)

  • 请注意.Random.seed在您的会话中使用了一些随机性之前不存在.因此,你应该在前面添加`if(!exists(".Random.seed"))set.seed(NULL)`来初始化它. (5认同)
  • 我怎样才能得到当前的种子? (2认同)

mpe*_*tis 6

洪先生的上述回答很有力。对于快速而肮脏的解决方案,我只是重新执行整个脚本直到获得有趣的行为,我随机选择一个整数,将其打印出来,然后将其用作种子。如果我的特定运行有有趣的行为,我会注意到该种子:

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”是一个正整数,表示您想要运行代码的次数。

通过这种方式,您可以快速生成大量输出,并为每次迭代提供单独的种子以实现可重复性。