默认情况下,rnorm
函数使用哪种算法生成标准正态分布的随机数?
答案 0 :(得分:12)
请参阅?RNGkind
。默认值是反演算法:
normal.kind
可以是“Kinderman-Ramage”,“Buggy Kinderman-Ramage”(不是 forset.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。我认为,仍然值得在这个帖子中拼出一些东西。