我的理解是 usingset.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
我的理解是 usingset.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 演示的那样,您必须在每次使用随机数生成器之前重置种子,以确保它每次都使用相同的种子。
值得强调的是,每次设置种子时,数字序列仍然是可重现的,因为这种重新初始化。
因此,尽管每次后续调用 egrnorm
时,每次调用都会得到不同的答案,但从设置种子的点开始,您仍然会得到相同的数字序列。
例如,根据原始问题:
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
.
这里的要点是,如果您在脚本开始时设置一次种子,您将在每次运行整个脚本时生成相同的随机数集,同时从每个随机数生成器调用中获取不同的数字集代码。这是因为您从一开始就以该种子的相同序列运行。这可能是一件好事,这意味着如果您想要一个可重现的脚本,您可以在开始时设置一次种子。