使用set.seed多少次(123)

时间:2013-09-09 10:36:26

标签: r

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

1 个答案:

答案 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”总是相同,无论前面是什么,我都应该在此之前设置种子。

请注意,由于我在创建CCC之前没有重置种子,并且有一个新功能需要在BBCC之间生成随机数第二个示例,CCC的值现在不同了。如果您希望它们相同,则必须在创建set.seedC之前插入另一个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