set.seed(n)和set.seed(n + 1)之间的真正区别是什么?

时间:2017-10-28 21:47:08

标签: r random parallel-processing seed

我正在尝试弄清楚 set.seed() 功能在R中是如何工作的。

我很好奇set.seed( 3 )set.seed( 4 )是否更有可能生成重复的样本,而不是set.seed( 3 )set.seed( 100 )

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

如果没有,我可以断定n中的其他 set.seed( n ) 只要它们不同就没有任何意义吗?

我听说过与独立随机流相关的内容?这是n与此相关吗?

如果是,我该如何定义独立的随机流? 我已经阅读了What does the integer while setting the seed mean?,但看起来并没有回答我的问题。

2 个答案:

答案 0 :(得分:3)

让我也尝试简单回答一下。我相信这两条评论很有用。

我们的程序中有时需要随机数字。计算机依靠算法生成随机数。因此,我们可以选择重新生成生成的随机数序列。这对于复制某些人的工作非常有用。在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)的流,反之亦然。

因此,通常,可以将由不同种子生成的随机数序列处理为独立的。

答案 1 :(得分:0)

我认为对由两个不同种子产生的随机数流之间的关系做出任何假设是个坏主意,除非基础随机数生成器记录了这种关系。例如,我很惊讶地发现默认的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

我还没有注意到任何其他种子价值的这种行为,但这足以吓跑我做出假设。

如果您关心这些问题,请阅读nextRNGStream包中的nextRNGSubStreamparallel函数。这些用于生成.Random.seed值,从而产生独立的随机数流。