【问题标题】:How many times to use set.seed(123)使用多少次 set.seed(123)
【发布时间】:2013-09-12 19:54:56
【问题描述】:

我有 60 行代码。在整个代码中,有几个对随机数生成器的调用,包括rnorm()。将set.seed(x) 放在代码的最开始是否就足够了,还是每次代码中发生随机数生成时我都需要 set.seed?

【问题讨论】:

标签: r


【解决方案1】:

这真的取决于你如何预见未来代码的变化。

如果您希望在代码中较早的位置包含需要生成随机数的命令,并且您希望复制之前在插入该代码之前获得的结果,您应该在代码中的适当位置使用set.seed()

例子:

set.seed(1)
A <- rnorm(10)
B <- rnorm(10)
C <- rnorm(10) ## I always want "C" to be the results I get here

set.seed(1)
AA <- rnorm(10); BB <- rnorm(10); CC <- rnorm(10)

identical(A, AA)
# [1] TRUE
identical(B, BB)
# [1] TRUE
identical(C, CC)
# [1] TRUE

set.seed(1)
A <- rnorm(10); B <- rnorm(10); C <- rnorm(10)

set.seed(1)
AA <- rnorm(10); BB <- rnorm(10); BA <- rnorm(10); CC <- rnorm(10)

identical(A, AA)
# [1] TRUE
identical(B, BB)
# [1] TRUE
identical(C, CC)
# [1] FALSE

在上面,如果我希望“C”无论前面发生什么都始终相同,我应该在那之前设置种子。

请注意,由于我在创建CCC 之前没有重置种子,并且在第二个示例中,有一个新函数需要在BBCC 之间生成随机数,因此@ 的值987654327@ 和 CC 现在不同了。如果您希望它们相同,则必须在创建 CCC 之前插入另一个 set.seed,如下所示:

set.seed(1)
A <- rnorm(10)
B <- rnorm(10)
set.seed(2)
C <- rnorm(10) ## I always want "C" to be the results I get here

set.seed(1)
AA <- rnorm(10); BB <- rnorm(10); BA <- rnorm(10);
set.seed(2)
CC <- rnorm(10)

identical(A, AA)
# [1] TRUE
identical(B, BB)
# [1] TRUE
identical(C, CC)
# [1] TRUE

【讨论】:

  • @user1984076 是的。查看set.seed(1); runif(4); runif(4),然后查看set.seed(1); runif(8)
  • 但是如果我在 CC 之前设置种子,那么它将与 AA 相同,对吧?
  • 使用set.seed(X),您将始终获得从(虚拟)索引1开始的相同数字序列。使用具有相同X的下一个set.seed,您只需重置位置。请参阅此 set.seed(1); A = rnorm(20); set.seed(1); B = c(rnorm(10),rnorm(5),rnorm(5)); identical(A,B); 比较 identical(C, CC) 失败,因为序列中的一些随机数已被 BA 消耗。
  • @TomasGreif,是的,完全正确。
  • 总结:在大多数情况下,在特定脚本中只需要一次。如果我认为稍后我会将脚本分解为更小的脚本并且我希望脚本的每个部分都可以作为独立脚本进行复制,我有时会不止一次地包含它。
猜你喜欢
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 2012-11-16
相关资源
最近更新 更多