我的理解是使用set.seed
确保了可重复性,但R 2.15.2
中的以下R代码不是这种情况。我在这里错过了什么吗?
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
答案 0 :(得分:21)
set.seed()
重新初始化random number generator。
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
答案 1 :(得分: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演示的那样,你必须在每次使用随机数生成器之前重置种子,以保证它每次都使用相同的种子。
答案 2 :(得分:2)
这里值得强调的是,由于重新初始化,每次设置种子时数字的序列仍可再现。
因此,尽管随后每次调用,例如Route::post('/sendEmails', 'SendEmeilController@sendEmails');
每个电话给您的答案都是不同的,从设置种子的那一刻起,您仍然会获得相同的数字顺序。
例如,按照原始问题:
rnorm
产生与10相同的数字序列:
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(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
的任何一系列调用。
这里的要点是,如果您在脚本开始时设置一次种子,则每次运行整个脚本时都会获得相同的随机数集,而获得的集却不同代码中每个随机数生成器调用的数量。这是因为从一开始,您就从该种子开始以相同的顺序运行。这可能是一件好事,这意味着如果您想要可复制的脚本,则可以在开始时设置一次种子。