【问题标题】:Unexpected behavior of set.seed() in conjunction with .Random.seed in R?set.seed() 与 R 中的 .Random.seed 一起出现的意外行为?
【发布时间】:2018-06-18 22:52:49
【问题描述】:

我偶然发现了这种意外行为(对我来说),这可能是由于我对.Random.seed 的误用和/或误解。

set.seed(1234)  # This is for reproducibility
s1 <- .Random.seed
set.seed(s1)
s2 <- .Random.seed
runif(1)
s3 <- .Random.seed
set.seed(s3)
s4 <- .Random.seed
all(s2==s4)  # TRUE

我不明白的部分是最后一行。种子集怎么会“返回”到s2,即runif(1)被调用之前的集合?

我知道.Random.seed 保存了统一随机数生成器的种子集,但我的理解是我也可以将它用作set.seed() 函数的输入。

【问题讨论】:

  • set.seed() 仅用于获取单个数字。这并不意味着从.Random.seed 中获取值。当你传入一个向量时,它只会取第一个数字。请注意,s1[1]==s3[1] (403) 与两次调用 set.seed(403) 相同。你可以看到all(s1==s2)==FALSEset.seed(s1); runif(1); set.seed(s2); runif(1) 你得到了相同的数字。如果需要,您可以直接分配给.Random.seed&lt;-,而不是使用set.seed()
  • @MrFlick 这应该是一个答案,而不是一个评论
  • @MrFlick 谢谢,就是这样。我认为 set.seed() 会使用整个向量作为第一个参数,而不仅仅是它的第一个元素。我会期待某种警告。

标签: r random


【解决方案1】:

您不能将整数向量.Random.seedset.seed 一起使用。仅使用第一个整数。确实,你保存的RNG状态和调用set.seed(403)时一样,是.Random.seed的第一个元素。

如果你确定你有一个有效种子向量,那么你可以将它分配给.Random.seed。但是,您可能最好使用rngtools::RNGseed(),因为它至少会进行一些基本的错误检查:

set.seed(1234)  # This is for reproducibility
s1 <- .Random.seed
runif(5)

.Random.seed <- s1
runif(5)

rngtools::RNGseed(s1)
runif(5)

【讨论】:

  • 谢谢,这就是它(以及更多)!
猜你喜欢
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多