r лучше всего работает с использованием векторизации. Вместо цикла мы должны выбирать все сразу:
sample(c(-1, 1), 100, replace = TRUE)
Мы также знаем, что если мы получим 10 потерь, мы будем разорены. Переводит в кумулятивную сумму:
cumsum(sample(c(-1, 1), 100, replace = TRUE))
any(cumsum(sample(c(-1, 1), 100, replace = TRUE)) == -10)
Наконец, мы можем использовать replicate()
, чтобы повторить ту же самую симуляцию:
#specify simulation criteria
n <- 100
n_sim <- 10
# betting criteria
n_broke <- 10 #if we have 10 net losses, we're broke
bet <- 10 #each bet is $10
# way 1
set.seed(123)
replicate(n_sim, cumsum(sample(c(-1, 1), n, replace = TRUE)))
#or with actual money totals - note, 1st row is the initial money amount
set.seed(123)
replicate(n_sim, cumsum(c(n_broke * bet, bet * sample(c(-1, 1), n, replace = TRUE))))
#or a summary of it:
set.seed(123)
table(replicate(n_sim, ifelse(any(cumsum(sample(c(-1, 1), n, replace = TRUE)) == -n_broke), 'Out_of_Money', 'Has_Money')))
#faster way to do it:
set.seed(123)
table(
ifelse(
apply(matrix(sample(c(-1,1), n * n_sim, replace = TRUE), ncol = n_sim),
2,
function(x) min(cumsum(x)) <= -n_broke),
'Out_of_Money', 'Has_Money')
)
Для n_sim = 10000:
Has_Money Out_of_Money
6783 3217
И что происходит за кадром:
set.seed(123)
replicate(n_sim, cumsum(c(n_broke * bet, bet * sample(c(-1, 1), n, replace = TRUE))))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 100 100 100 100 100 100 100 100 100 100
[2,] 90 90 110 110 90 110 110 110 90 110
[3,] 80 100 120 120 80 120 120 100 80 120
[4,] 70 110 130 110 70 130 130 90 90 110
[5,] 80 100 120 120 60 140 120 80 100 100
[6,] 70 110 130 110 50 130 110 90 90 110
[7,] 80 120 140 100 40 120 100 80 80 120
[8,] 90 110 150 110 50 110 90 70 70 130
[9,] 100 100 140 100 40 100 100 60 60 120