使用R 2.15.2中的set.seed

7

我的理解是使用set.seed可以确保可重复性,但在以下R代码中(R 2.15.2),情况并非如此。这里有什么我不明白的吗?

set.seed(12345)
rnorm(5)
[1]  0.5855288  0.7094660 -0.1093033 -0.4534972  0.6058875
 rnorm(5)
[1] -1.8179560  0.6300986 -0.2761841 -0.2841597 -0.9193220
3个回答

21

set.seed() 重新初始化 伪随机数生成器

set.seed(12345)
rnorm(5)
[1]  0.5855288  0.7094660 -0.1093033 -0.4534972  0.6058875

set.seed(12345)
rnorm(5)
[1]  0.5855288  0.7094660 -0.1093033 -0.4534972  0.6058875

set.seed(12345)
rnorm(5)
[1]  0.5855288  0.7094660 -0.1093033 -0.4534972  0.6058875

12

任何使用随机数生成器的调用都将更改当前种子,即使您已经使用 set.seed 手动设置了它。

set.seed(1)
x <- .Random.seed # get the current seed
runif(10) # uses random number generator, so changes current seed
y <- .Random.seed
identical(x, y) # FALSE

正如@StephanKolassa所证明的那样,您需要在每次使用随机数生成器之前重置种子,以确保它每次都使用相同的种子。


3

值得强调的是,由于重新初始化,每次设置种子时数字的顺序仍然可以再现。

因此,虽然每次调用例如rnorm时都会得到不同的答案,但从设置种子的那一点开始,您仍将获得相同的数字序列

例如,根据原始问题:

set.seed(12345)
rnorm(5)
[1]  0.5855288  0.7094660 -0.1093033 -0.4534972  0.6058875
rnorm(5)
[1] -1.8179560  0.6300986 -0.2761841 -0.2841597 -0.9193220

与以下代码产生相同的10个数字序列:

set.seed(12345)
rnorm(10)
[1]  0.5855288  0.7094660 -0.1093033 -0.4534972  0.6058875
-1.8179560  0.6300986 -0.2761841 -0.2841597 -0.9193220

或者
set.seed(12345)
rnorm(7)
[1]  0.5855288  0.7094660 -0.1093033 -0.4534972  0.6058875
-1.8179560  0.6300986
rnorm(3)
[1] -0.2761841 -0.2841597 -0.9193220

或者使用一系列对rnorm的调用。

这里的重点是如果你在脚本开头设置种子,每次运行整个脚本时都会生成相同的随机数集合,而从代码中每个随机数生成器调用中获取不同的数字集合。这是因为你在开始时使用了相同的序列。这可能是一件好事情,这意味着如果你想要一个可重复的脚本,你可以在开始时设置种子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接