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)
这里的问题是随机种子在使用后会发生变化,因此当您生成 时, 1 的种子是不同的b。b如果您希望它与以下内容相同,则必须在创建之前重置种子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