2016-02-12 108 views
4

我设置种子,生成均匀分布的随机数,并使用逆CDF方法来得到一组正态分布的随机数的。然后,我重置种子并使用rnorm()生成正态分布的随机数。结果是不同的。 R中的随机数生成器是否默认为Mersenne-Twister算法来生成整数?如果不是所有的R中的其他随机数(正常,均匀,指数等的分布)是这些伪随机整数的一些确定性的转型?为什么R命令RNORM()和qnorm(runif())产生不同的随机数?

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

我觉得两个向量分享3个元素,你是正确的 - 只是看是相同的顺序被保留的元素。 – user2300944

回答

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); 

看起来它花费的少显著位的第二个数字。

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

+0

我承认这解释了RNORM函数的行为,虽然C函数qnorm5只返回一个双,那么,第二个数字来自于它是我不清楚。我已经尝试了与rexp()相同的技巧,并且无法检测到模式。有什么想法吗? '> set.seed(1) > U1 < - runif(5) > U1 [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 > Z1 < - Q实验(U1) > Z1 [1] 0.3085771 0.4654124 0.8506279 2.3882278 0.2252482 > set.seed(1) > Z2 < - rexp(5) > Z2 [1] 0.7551818 1.1816428 0.1457067 0.1397953 0.4360686' – user2300944

+0

帕斯卡,你询问如何下车的RNORM()和逆CDF方法?也许只是在使用逆CDF方法时只生成一个向量两次,并且只保留奇数元素? – user2300944

+1

'rexp'使用循环计算,并为每个输出占用*很多随机数:https://github.com/SurajGupta/r-source/blob/master/src/nmath/sexp.c – Thilo