我的理解是使用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
我的理解是使用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
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
任何使用随机数生成器的调用都将更改当前种子,即使您已经使用 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所证明的那样,您需要在每次使用随机数生成器之前重置种子,以确保它每次都使用相同的种子。
值得强调的是,由于重新初始化,每次设置种子时数字的顺序仍然可以再现。
因此,虽然每次调用例如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
的调用。
这里的重点是如果你在脚本开头设置种子,每次运行整个脚本时都会生成相同的随机数集合,而从代码中每个随机数生成器调用中获取不同的数字集合。这是因为你在开始时使用了相同的序列。这可能是一件好事情,这意味着如果你想要一个可重复的脚本,你可以在开始时设置种子。