就他们使用的概率分布而言?我知道runif给出了小数,而样本给出了整数,但我感兴趣的是样本是否也使用“均匀概率分布”?
答案 0 :(得分:10)
考虑以下代码和输出:
> set.seed(1)
> round(runif(10,1,100))
[1] 27 38 58 91 21 90 95 66 63 7
> set.seed(1)
> sample(1:100, 10, replace=TRUE)
[1] 27 38 58 91 21 90 95 67 63 7
这强烈建议当被要求做同样的事情时,2个函数提供几乎相同的输出(尽管有趣的是round
提供相同的输出而不是floor
或{{1 }})。主要区别在于默认值,如果你不改变那些默认值,那么两者都会给出称为统一的东西(虽然ceiling
会被认为是离散的统一,默认情况下没有替换)。
<强> 修改 强>
更正确的比较是:
sample
而不是使用> ceiling(runif(10,0,100))
[1] 27 38 58 91 21 90 95 67 63 7
。
我们甚至可以提升一个档次:
round
当然如果使用> set.seed(1)
> tmp1 <- sample(1:100, 1000, replace=TRUE)
> set.seed(1)
> tmp2 <- ceiling(runif(1000,0,100))
> all.equal(tmp1,tmp2)
[1] TRUE
probs
参数(并非所有值都相等),那么它将不再是统一的。
答案 1 :(得分:7)
sample
samples ,如果传入length-1输入作为第一个参数,则返回整数输出(s )。
另一方面,runif
会从真实评估的范围中返回一个样本。
> sample(c(1,2,3), 1)
[1] 2
> runif(1, 1, 3)
[1] 1.448551
答案 2 :(得分:0)
sample()
的运行速度超过ceiling(runif())
这有助于了解是进行多次模拟还是自举。
原始时间试用脚本,时间测试4个等效脚本:
n<- 100 # sample size
m<- 10000 # simulations
system.time(sample(n, size=n*m, replace =T)) # faster than ceiling/runif
system.time(ceiling(runif(n*m, 0, n)))
system.time(ceiling(n * runif(n*m)))
system.time(floor(runif(n*m, 1, n+1)))
比例时间优势随着n和m而增加,但是注意你不要填补记忆!
BTW不要使用round()
将均匀分布的连续转换为均匀分布的整数,因为终端值的选择时间只有它们的一半。