我使用以下代码:
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()的实际作用。
我将不胜感激。 `
答案 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
之前)。