为什么R命令rnorm()和qnorm(runif())生成不同的随机数?

时间:2016-02-12 02:27:01

标签: r random

我设置种子,生成均匀分布的随机数,并使用逆CDF方法得到一组正态分布的随机数。然后,我重置种子并使用rnorm()生成正态分布的随机数。结果不同。 R中的随机数生成器是否默认使用Mersenne-Twister算法生成整数? R(正常,均匀,指数等分布)中的所有其他随机数不应该是这些伪随机整数的某些确定性变换吗?

set.seed(1)
u1 <- runif(5)
u1
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
z1 <- qnorm(u1)
z1
# [1] -0.6264538 -0.3262334  0.1836433  1.3297993 -0.8356286
set.seed(1)
z2 <- rnorm(5)
z2
# [1] -0.6264538  0.1836433 -0.8356286  1.5952808  0.3295078

是的,我看到一些元素匹配,但不一定以相同的顺序出现。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

它看起来像所有元素都以相同的顺序出现,但在第一个方法的输出中总会散布一个额外的元素。

这似乎表明rnorm每次迭代会消耗两个随机数,这与this answer一致。

case INVERSION:
#define BIG 134217728 /* 2^27 */
/* unif_rand() alone is not of high enough precision */
u1 = unif_rand();
u1 = (int)(BIG*u1) + unif_rand();
return qnorm5(u1/BIG, 0.0, 1.0, 1, 0);

看起来需要第二个数字来表示不太重要的位。

这意味着当您查看更多数字时,您观察到的“相同”数字也会略有不同。