7

我的理解是 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
4

3 回答 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
于 2013-01-17T13:40:34.280 回答
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 演示的那样,您必须在每次使用随机数生成器之前重置种子,以确保它每次都使用相同的种子。

于 2013-01-17T13:55:16.437 回答
3

值得强调的是,每次设置种子时,数字序列仍然是可重现的,因为这种重新初始化。

因此,尽管每次后续调用 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.

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

于 2018-10-14T23:40:24.670 回答