【问题标题】:What is the true difference between set.seed(n) and set.seed(n+1)set.seed(n) 和 set.seed(n+1) 之间的真正区别是什么
【发布时间】:2018-04-10 05:25:08
【问题描述】:

我正在尝试弄清楚 set.seed() 函数在 R 中的工作原理。

我很好奇set.seed( 3 )set.seed( 4 ) 是否比set.seed( 3 )set.seed( 100 ) 更容易产生重复样本?

如果是,在出现set.seed( 4 ) 生成的样本中的匹配项之前,set.seed( 3 ) 可以生成多少个唯一样本?

如果不是,我是否可以得出结论,set.seed( n ) 中的不同 n 只要它们不同就没有任何意义?

我听说了一些与独立随机流有关的事情?这个n和那个有关系吗?

如果是,如何定义一个独立的随机流? 我已经阅读了What does the integer while setting the seed mean?,但它似乎没有回答我的问题。

【问题讨论】:

  • 哎呀......这很难回答,因为它取决于底层的 PRNG。通常你会期望任何 2 个种子是两个不同的 PRNG 路径......如果由唯一种子(无论是 1 和 2 还是 1 和 1000)播种,这对于两个独立的流来说也足够了......但实际上播种很困难,纯粹的 MersenneTwister 实现可能会惩罚您仅通过使用 2 个不同的种子来获得独立的流(同时保持所有其他参数;可能隐藏在 R 中,常量)。您的问题也非常非正式且难以处理(在匹配之前生成...)更准确!
  • 这也可能有额外的帮助:stats.stackexchange.com/questions/86285/…

标签: r random parallel-processing seed


【解决方案1】:

让我也尝试给出一个简短的简单答案。我确实相信这两个 cmets 很有用。

我们的程序有时需要随机数。计算机依靠一种算法来生成随机数。因此,我们可以选择重新创建生成的随机数序列。这对于复制某人的作品非常有用。在 R 中,如果我们使用

sed.seed(42)
runif(5)  

在任何时候,它都会给出相同的随机数序列。

预计set.seed(n)set.seed(n+1)set.seed(n1)set.seed(n2) 之间没有关系。或者,预计set.seed(3) 在多次迭代后不会生成set.seed(4) 流,反之亦然。

因此,一般来说,可以将不同种子生成的随机数序列视为独立的。

【讨论】:

    【解决方案2】:

    我认为对由两个不同种子产生的随机数流之间的关系做出任何假设都是一个坏主意,除非底层随机数生成器记录了这种关系。例如,我惊讶地发现默认的 Mersenne-Twister RNG 是这样的:

    > set.seed(0)
    > x <- runif(10)
    > set.seed(1)
    > y <- runif(10)
    > x[2:10] == y[1:9]
    [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
    

    我没有注意到任何其他种子值对的这种行为,但这足以让我不敢做出假设。

    如果您关心这些问题,您应该阅读parallel 包中的nextRNGStreamnextRNGSubStream 函数。这些旨在生成.Random.seed 值,从而产生独立的随机数流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-05-04
      • 2017-03-04
      • 2020-07-31
      • 1970-01-01
      • 2019-01-28
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多