13

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

4

1 回答 1

9

这实际上取决于您如何预见未来代码的变化。

如果您希望在代码中较早的位置包含需要生成随机数的命令,并且您希望在插入该代码之前复制先前获得的结果,则应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请注意,由于在创建or之前我没有重置种子,并且在第二个示例中,CC有一个新函数需要在 和 之间生成随机数,因此和的值现在不同。如果您希望它们相同,则必须在创建and之前插入另一个,如下所示:BBCCCCCset.seedCCC

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
于 2013-09-09T10:42:05.673 回答