【发布时间】:2015-01-26 15:26:48
【问题描述】:
想象一下,我递给你一个印有“-1”的乒乓球。然后我告诉你从标有“第一个袋子”的袋子里再抽一个乒乓球。这个袋子里有30,000个球,有的标有“-1”,有的标有“0”,有的标有“+1”。无论您画哪个球,您都将其编号添加到您当前的“分数”-1。例如,如果你画了 -1,你的新分数是 -2。
只要您的新分数低于零,您就可以再次从第一个袋子中抽奖并再次添加您的分数。但是,如果当您的分数达到零或更高时,您就会从第二个袋子中抽奖,该袋子具有不同的 -1s 0s 和 +1s 组成。
我希望你从相应的袋子里抽出总共 1000 个乒乓球(即,取决于你当前的分数是否低于零),然后在“放”。然后我想让你重复这个实验一百万次,然后告诉我你最终得分高于零的集合的百分比。
是否有更快/更有效的编码方式?由于绘图不是独立的,因此很难对循环进行矢量化,尽管也许我可以使用ifelse 和filter 的组合?我怀疑复制是昂贵的部分。
ptm <- proc.time()
###First bag
n=30000
s=155
f=255
z=n-s-f
first_bag=c(rep(0,z), rep(1,s), rep(-1,f))
###Second bag
n2=30000
s2=275
f2=285
z2=n2-s2-f2
second_bag=c(rep(0,z2), rep(1,s2), rep(-1,f2))
###Simulate draws
sim_draw=function(draws){
score=-1
for (i in 1:draws) {
if (score < 0) {
score=score + sample(first_bag, 1, replace=TRUE)} else {
score=score + sample(second_bag, 1, replace=TRUE)}
}
score
}
###Repeat sims and find area above zero
samp_distribution=replicate(1000000, sim_draw(1000))
mean(samp_distribution>0)
print(proc.time() - ptm)
【问题讨论】:
-
我会推荐 codereview.stackexchange.com 来优化代码(只要它工作正常)。
标签: r loops simulation montecarlo