Set.seed()与for循环结合

时间:2018-07-16 01:46:36

标签: r

我使用以下代码:

set.seed(74)
length = 10
W = rep(0,length)
W[1] = 0
for (i in 1:length){ 
W[i+1] = W[i]+ rnorm(1)
}`

目的是在使用种子74时始终生成相同范围的W。现在,我想添加另一个向量,称为Z,但保持相同的W:

set.seed(74)
length = 10
W = rep(0,length)
Z = rep(0,length)
W[1] = 0
Z[1] = 0
for (i in 1:length){ 
W[i+1] = W[i]+ rnorm(1)
Z[i+1] = Z[i] + rnorm(1)
}`

现在,问题发生了,W发生了变化,但是我想要与第一个代码中相同的W和一个附加的随机Z。实际上,我不了解命令set.seed()的实际作用。

我将不胜感激。 `

1 个答案:

答案 0 :(得分:1)

set.seed()设置(伪)随机数生成器的种子,该种子用于生成rnorm()所调用的值。可以将其视为生成预定的随机数列表的起点。如果您选择种子,说100(该值完全是任意的),然后运行

set.seed(100); rnorm(10)

您将获得与将种子设置为相同值并运行相同命令时完全相同的结果。如果设置不同的种子,则(可能)将获得不同的数字字符串。

将随机数视为一个长长的预定列表,可以帮助您了解为什么第二个代码块为W生成的值与第一个块不同。想象一下,对于您绘制的每个随机数,您都将其向下移动了一个。在第一段代码中,选择10个随机数并将其设置在W中。在第二个代码块中,选择一个随机数并将其设置为W,然后选择另一个随机数并将其设置为Z,依此类推。在两个块之间,为W生成的随机数的位置不同。它们中的所有10个都在第一个块中转到W,但是只有一半在第二个块中转到W(另一半到Z)。

不过,请注意,两个块之间的W[2]是相同的;在两种情况下,这都是设置种子后生成的第一个随机数。第二个数字进入Z。在第一个块中,如果您使用W[3]-W[2],它为您提供了设置种子后绘制的第二个随机数的值,您将在第二个块中看到它等于Z[2],即也是设置种子后绘制的第二个数字。

要每次在W中获得相同的结果,您需要确保遵守随机数的顺序。这意味着您应该为W运行一次第一个块,而为Z运行一次第一个块(仅设置一次种子,即仅在W之前)。