rnorm函数使用哪种算法

时间:2013-03-12 18:49:21

标签: r random

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

2 个答案:

答案 0 :(得分:12)

请参阅?RNGkind。默认值是反演算法:

  

normal.kind可以是“Kinderman-Ramage”,“Buggy Kinderman-Ramage”(不是   for set.seed),“Ahrens-Dieter”,“Box-Muller”,“Inversion”(the   默认)或“用户提供”。 (有关反演,请参阅参考资料   qnorm。)1.7.1之前版本中使用的Kinderman-Ramage生成器   (现在称为“Buggy”)有几个近似误差,应该只有   用于复制旧结果。 “Box-Muller”发电机是   作为法线对生成有状态并顺序返回。   无论何时选择状态(即使它是当前状态),状态都会复位   正常的发电机)和当种类改变时。

您可以通过

更改算法
RNGkind(normal.kind = "Box-Muller")

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

答案 1 :(得分:8)

另一个答案是充分的,但给我留下了一些问题;特别是,我没有在文档中看到* "Inversion"算法到底是什么,所以我潜入source code,这也提供了对其他可能算法的论文的学术参考,弄清楚到底在做什么。

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

所以在基数上看,默认的"Inversion"算法生成一个高精度浮点数(看起来像53位,或mantissa size for 64-bit floating numbers),然后将其发送到qnorm5函数。是正态分布的CDF函数。

关于qnorm5函数如何工作(假设普通CDF没有封闭形式也没有反向CDF),我没有太多运气破解似乎是源代码here ,但他们确实提供了进一步的学术参考,即Beasley, J. D. and S. G. Springer (1977)Wichura, M.J. (1988);前者通常用于CDF的小分位数,后者用于大(z>7左右)。

值得注意的是(截至撰写本文时)此算法似乎是shared by the Julia language,它还共享qnorm5使用的R代码。

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