【问题标题】:Set.seed() in combination with for loopSet.seed() 结合 for 循环
【发布时间】:2018-12-23 12:24:20
【问题描述】:

我使用以下代码:

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() 真正在做什么。

如果有任何帮助,我将不胜感激。 `

【问题讨论】:

标签: r


【解决方案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 中获得相同的结果,您需要确保遵守随机数的顺序。这意味着您应该为WZ 运行第一个块而不是第二个块(仅设置一次种子,即仅在W 之前)。

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 2012-12-03
    • 2018-08-12
    • 1970-01-01
    • 2020-11-27
    • 2012-11-18
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多