@ G5W уже показал, где основные проблемы с кодом ;Чтобы расширить это, вам следует подумать об улучшении самого алгоритма.
- Например, имитация 100-кратного броска одной монеты (
sample(c("Heads", "Tails"), 1)
) - это то же самое (но намного медленнее), что и имитация 100 монет.переворачивается один раз (sample(c("Heads", "Tails", 100, replace = T)
). - Если вы делаете выборку один раз из
c("Heads", "Tails")
, вам не нужен replace = T
, потому что вы рисуете только один из двух элементов. - Я рекомендую сделать
nFlips
функциейаргумент, позволяющий легко изменить этот параметр.
Таким образом, улучшенная функция myCoinFlips2
может выглядеть следующим образом
myCoinFlips2 <- function(prob = 0.5, nFlips = 100) {
return(sum(sample(
c("Heads", "Tails"), nFlips, replace = T, prob = c(prob, 1 - prob)) == "Heads"))
}
или поскольку вы не сохраняете серию "Heads"
и "Tails"
просто сумма TRUE
и FALSE
myCoinFlips3 <- function(prob = 0.5, nFlips = 100) {
return(sum(sample(
c(TRUE, FALSE), nFlips, replace = T, prob = c(prob, 1 - prob))))
}
Чтобы продемонстрировать, насколько значительным может быть увеличение производительности при выборке nFlips
подбрасываний монеты один раз, в отличие от выборки броска одной монетыnFlips
раз мы можем запустить microbenchmark
для nFlips = 10^6
подбрасывания монет
library(microbenchmark)
res <- microbenchmark(
myCoinFlips = myCoinFlips(nFlips = 10^6),
myCoinFlips2 = myCoinFlips2(nFlips = 10^6),
myCoinFlips3 = myCoinFlips3(nFlips = 10^6),
times = 10
)
#Unit: milliseconds
# expr min lq mean median uq max
# myCoinFlips 7118.30839 7379.53689 7646.05646 7722.00763 7840.07345 8235.95764
# myCoinFlips2 40.00080 41.51453 48.08246 47.16093 50.62694 65.41062
# myCoinFlips3 23.47758 25.20427 27.55469 26.36489 30.88384 32.17406
library(ggplot2)
autoplot(res)
![enter image description here](https://i.stack.imgur.com/0XdDd.png)
Обратите внимание, что myCoinFlips
составляет 2 порядкавеличина медленнее, чем у двух других методов.