我设置种子,生成均匀分布的随机数,并使用逆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
是的,我看到一些元素匹配,但不一定以相同的顺序出现。有人可以解释一下吗?
答案 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);
看起来需要第二个数字来表示不太重要的位。
这意味着当您查看更多数字时,您观察到的“相同”数字也会略有不同。