R 中的“rexp(1000, 1)”和“replicate(1000, rexp(1,1))”有什么区别?

Kan*_*ana 2 simulation statistics r replicate exp

我正在尝试使用参数为 1 的指数分布生成 1000 个数字。

将种子值设置为 1 后,我尝试了rexp(1000, 1)replicate(1000, rexp(1, 1)),但是得到的两个向量的中位数不同。

我预计这两个表达式生成的向量是相同的,因为它们都是从相同种子值下的相同指数分布中采样的。

rexp(1000, 1)和 和有什么区别replicate(1000, rexp(1, 1))?在实践中我应该使用哪个?

这是我尝试过的代码:

> options(digits = 2)  
> set.seed(1)
> 
> a <- rexp(1000, 1)   
> b <- replicate(1000, rexp(1, 1))
> 
> median(a)   
[1] 0.73   
> median(b)   
[1] 0.68
Run Code Online (Sandbox Code Playgroud)

All*_*ron 5

这里的问题是随机种子在使用后会发生变化,因此当您生成 时, 1 的种子是不同的bb如果您希望它与以下内容相同,则必须在创建之前重置种子a

set.seed(1)

a <- rexp(1000, 1)

set.seed(1)

b <- replicate(1000, rexp(1, 1))

median(a)
#> [1] 0.7346113

median(b)
#> [1] 0.7346113
Run Code Online (Sandbox Code Playgroud)

至于您应该使用哪个,肯定是rexp(1000, 1),因为这会生成对底层 C 代码的单个调用,而不是 1000 个调用。虽然我们从上面可以看到这两个代码生成相同的结果,但一个简单的基准测试表明速度rexp大约快 50 倍。

microbenchmark::microbenchmark(a = rexp(1000, 1), 
                               b = replicate(1000, rexp(1, 1)))
#> Unit: microseconds
#>  expr      min        lq       mean   median       uq       max neval cld
#>     a   32.501   33.5005   34.54794   34.101   34.701    42.301   100  a 
#>     b 1503.402 1539.0010 2043.20113 1569.451 1646.901 10051.202   100   b
Run Code Online (Sandbox Code Playgroud)

创建于 2023-02-27,使用reprex v2.0.2