set.seed与R 2.15.2

时间:2013-01-17 13:23:45

标签: r random statistics

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

3 个答案:

答案 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 的任何一系列调用。

这里的要点是,如果您在脚本开始时设置一次种子,则每次运行整个脚本时都会获得相同的随机数集,而获得的集却不同代码中每个随机数生成器调用的数量。这是因为从一开始,您就从该种子开始以相同的顺序运行。这可能是一件好事,这意味着如果您想要可复制的脚本,则可以在开始时设置一次种子。