我有60行代码。在整个代码中,有几个调用随机数生成器,包括rnorm()
。将set.seed(x)
放在代码的最开头是否足够,或者每次在代码中生成随机数时都需要set.seed吗?
答案 0 :(得分:7)
这实际上取决于您如何预见未来代码的变化。
如果您希望在代码中的较早位置包含命令,这些命令需要生成随机数,并且您希望在插入该代码之前复制之前的结果,那么您应该在代码中的适当位置使用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
之间生成随机数第二个示例,C
和CC
的值现在不同了。如果您希望它们相同,则必须在创建set.seed
和C
之前插入另一个CC
,如下所示:
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