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

我设置种子,生成均匀分布的随机数,并使用逆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

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

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

这似乎表明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);

看起来它需要第二个数字用于不太重要的位.

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

点赞