背景。我想在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())
不起作用,如何重置种子?
谢谢。
答案 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秒,则此解决方案将不起作用。
我相信这只是解决方法,主要问题仍然悬而未决。