R:set.seed在除去种子后产生相同的结果

时间:2018-07-01 21:18:12

标签: r random-seed

背景。我想在R v.3.5.0 for 周期内生成随机序列。为此,我使用类似下面的代码:

rm(.Random.seed, envir=globalenv())
some_list = list()
for (iter in 1:3) {
  set.seed(iter)
  some_list[[iter]] = sample(1:10)
}
some_list

这段代码向我返回了这样的列表:

> some_list
[[1]]
 [1]  3  4  5  7  2  8  9  6 10  1
[[2]]
 [1]  2  7  5 10  6  8  1  3  4  9
[[3]]
 [1]  2  8  4  3  9  6  1  5 10  7

此后,我重新运行相同的脚本,并希望在会话中运行rm(.Random.seed, envir=globalenv())后重置种子,从而得到不同的结果。

但是现实是不同的-即使从.Random.seed中删除了globalenv(),我仍然收到完全相同的列表。 请查看附带确切命令顺序的屏幕: Sequence of commands

我对set.seed的这种行为真的感到困惑。

我的问题是:

1)set.seed的这种行为正常吗?

2)如果rm(.Random.seed, envir=globalenv())不起作用,如何重置种子?

谢谢。

2 个答案:

答案 0 :(得分:1)

似乎您正在通过调用rm(.Random.seed, envir=globalenv())来针对随机行为,所以为什么不从代码中完全删除set.seed

rm(.Random.seed, envir=globalenv())
some_list = list()
for (iter in 1:3) {
  some_list[[iter]] = sample(1:10)
}
some_list

上面的内容每次运行都会产生不同的结果。我们的代码中不需要set.seed

答案 1 :(得分:-1)

我基于Sys.time()作为种子创建了一种解决方法。这是代码:

some_list = list()
for (iter in 1:3) {
  set.seed(as.numeric(Sys.time()))
  some_list[[iter]] = sample(1:10)
  Sys.sleep(1)
}
some_list

但是,尽管如此,我需要添加Sys.sleep(1),因为如果周期中的操作持续少于1秒,则此解决方案将不起作用。 我相信这只是解决方法,主要问题仍然悬而未决。