rnorm函数使用哪种算法

Kla*_*aus 11 random r

rnorm默认情况下,该函数使用哪种算法生成标准正态分布的随机数?

Jou*_*ske 13

?RNGkind.默认是反演算法:

normal.kind可以是"Kinderman-拉梅奇","越野车Kinderman-拉梅奇"(不用于set.seed),"阿伦斯-迪特","箱穆勒","反转"(缺省值),或"用户提供的".(有关反演,请参阅参考文献 qnorm.)1.7.1之前版本中使用的Kinderman-Ramage生成器(现在称为"Buggy")有几个近似误差,只能用于复制旧结果."Box-Muller"生成器是有状态的,因为生成了一对法线并且顺序返回.无论何时选择状态(即使它是当前的正常发生器)和更改种类,状态都会复位.

您可以通过更改算法

RNGkind(normal.kind = "Box-Muller")
Run Code Online (Sandbox Code Playgroud)

您可以通过查看找到当前设置的内容RNGkind()[2].


Mic*_*ico 8

另一个答案是充分的,但还有一些问题; 特别是,我没有看到文档中的任何地方*"Inversion"算法到底是什么,所以我深入研究了源代码,这也提供了对其他可能算法的论文的学术参考,以弄清楚到底在做什么.

    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);
Run Code Online (Sandbox Code Playgroud)

因此,在默认情况下,默认"Inversion"算法会生成一个非常长的浮点数,然后将其发送到qnorm5函数,该函数是正态分布的CDF函数.

至于qnorm5函数是如何工作的(假设普通CDF没有封闭形式也没有逆CDF),我没有太多运气破解这里似乎是源代码的东西,但它们确实提供了进一步的学术参考,即Beasley, JD和SG Springer(1977)Wichura,MJ(1988) ; 前者通常用于CDF的小分位数,后者用于大(z>7或左右).

值得注意的是(截至本文撰写时),该算法似乎由Julia语言共享,该语言也共享使用的qnorm5代码R.

*公平地说,回想起来,上面提到了Wichura ?qnorm.我认为,仍然值得在这个帖子中拼出一些东西.