Представьте, что я даю вам шарик для пинг-понга с напечатанным на нем «-1». Затем я предлагаю вам вытащить еще один мячик для пинг-понга из сумки с надписью «Первая сумка». В этом мешке 30 000 мячей, некоторые из которых отмечены "-1", некоторые - "0", а некоторые - "+1". Какой бы шар вы ни вытащили, вы добавляете его номер к вашему текущему «счету» -1. Например, если вы нарисовали -1, ваш новый счет будет -2.
Пока ваш новый счет ниже нуля, вы снова берете из первого мешка и снова добавляете к своему счету. Но если и когда ваш счет достигает нуля или выше, вы затем берете из второго мешка, который имеет другой состав -1, 0 и +1.
Я хочу, чтобы вы вытащили в общей сложности 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)