当随机种子被修复时,如何在R中生成随机数?

时间:2017-07-07 14:49:58

标签: r random

我正在进行一些随机模拟实验,并且在一步中我想估计随机数源相同时随机数之间的相关性,即常见的U(0,1)随机数。

我认为以下两个代码段应该产生相同的结果。

set.seed(1000)
a_1 = rgamma(100, 3, 4)
set.seed(1000)
b_1 = rgamma(100, 4, 5)
cor(a_1,b_1)

set.seed(1000)
u = runif(100)
a_2 = qgamma(u, 3, 4)
b_2 = qgamma(u, 4, 5)
cor(a_2,b_2)

但结果不同

> cor(a_1,b_1)
[1] -0.04139218
> cor(a_2,b_2)
[1] 0.9993478

固定的随机种子,我希望相关性接近于1(就像第二个代码段中的情况一样)。但是,第一个代码段中的输出是令人惊讶的

  1. 对于该特定种子(1000),第一段中的相关性具有负号和非常小的量值。标志和幅度都没有意义......

  2. 当玩不同种子(例如,1,10,100,1000)时,第一段中的相关性显着变化,而第二段中的相关性非常稳定。

  3. 任何人都可以提供一些有关R如何从同一种子中抽样随机数的见解吗?

    提前致谢!

1 个答案:

答案 0 :(得分:2)

set.seed(1)
u = runif(1000)

似乎是

的拼写错误
set.seed(1000)
u = runif(100)

如果是这样,我认为你认为两个实验应该相同的唯一原因是你假设rgamma(100, 3, 4)inverse transform sampling生成:从runif(100)开始,然后,通过参数3和4的伽马随机变量,通过cdf的倒数运行这100个数字。然而,关于伽玛随机变量的维基百科文章表明more sophisticated methods用于生成伽玛随机变量(涉及多个方法的方法)调用底层PRNG)。

?rgamma表明R使用维基百科文章讨论的Ahrens-Dieter算法。因此,没有理由期望您的两次计算会产生相同的结果。

如果我在回答的开头就把我的错误视为你实际想要的东西,那么我完全不知道为什么你会认为它们应该是等价的,因为它们会缺少与你相同的“同一种子”提及并且还对应于不同的样本大小。