将我的评论推广到一个答案:是的,有。
library("sos"); findFn("Ziggurat")
在包中找到 rziggurat函数SuppDists
;它是用C(或C++?)实现的,它的文档说
在 R 中运行的这个实现大约是 rnorm() 的三倍。
要注意的另一点在实践中可能会产生同样大或更大的差异,那就是在 R 中选择大块随机数比一个接一个地选择它们rnorm(1e6)
要快得多......即比vapply(seq(1e6),function(i) rnorm(1),numeric(1))
library("SuppDists")
library("rbenchmark")
n <- 1e5
benchmark(rziggurat(n),
rnorm(n),
vapply(seq(n),function(x) rnorm(1),numeric(1)))
## test elapsed relative user.self
## 2 rnorm(n) 1.138 13.233 1.140
## 1 rziggurat(n) 0.086 1.000 0.088
## 3 vapply(...) 29.043 337.709 29.046