【发布时间】:2013-09-12 19:54:56
【问题描述】:
我有 60 行代码。在整个代码中,有几个对随机数生成器的调用,包括rnorm()。将set.seed(x) 放在代码的最开始是否就足够了,还是每次代码中发生随机数生成时我都需要 set.seed?
【问题讨论】:
-
@AriB.Friedman,感谢您提供的链接。
标签: r
我有 60 行代码。在整个代码中,有几个对随机数生成器的调用,包括rnorm()。将set.seed(x) 放在代码的最开始是否就足够了,还是每次代码中发生随机数生成时我都需要 set.seed?
【问题讨论】:
标签: r
这真的取决于你如何预见未来代码的变化。
如果您希望在代码中较早的位置包含需要生成随机数的命令,并且您希望复制之前在插入该代码之前获得的结果,您应该在代码中的适当位置使用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”无论前面发生什么都始终相同,我应该在那之前设置种子。
请注意,由于我在创建C 或CC 之前没有重置种子,并且在第二个示例中,有一个新函数需要在BB 和CC 之间生成随机数,因此@ 的值987654327@ 和 CC 现在不同了。如果您希望它们相同,则必须在创建 C 和 CC 之前插入另一个 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
【讨论】:
set.seed(1); runif(4); runif(4),然后查看set.seed(1); runif(8)。
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 消耗。