Как исправить функцию, которая должна считать количество голов за 100 испытаний? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь написать функцию, которая просто имитирует классическую ситуацию с подбрасыванием монет, где вероятность получения голов равняется получению хвостов и подсчитывает наблюдаемые головы за 100 попыток.

Код, который у меня естьпопытка записи, с другой стороны, не делает этого, но возвращает либо 0, либо 1:

myCoinFlips <- function(prob = 0.5)
{
nFlips <- 100
   for(i in 1:length(nFlips)) {
count <- 0
result <- sample(c("Heads", "Tails"), 1, replace= TRUE, prob = 
c(prob, 1-prob))

   if (result[i] == "Heads") {
   count <- count + 1
   }
   }
 return(count)  
}

Как я могу исправить этот код, чтобы он отображал количество головок из 100 испытаний?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

@ G5W уже показал, где основные проблемы с кодом ;Чтобы расширить это, вам следует подумать об улучшении самого алгоритма.

  1. Например, имитация 100-кратного броска одной монеты (sample(c("Heads", "Tails"), 1)) - это то же самое (но намного медленнее), что и имитация 100 монет.переворачивается один раз (sample(c("Heads", "Tails", 100, replace = T)).
  2. Если вы делаете выборку один раз из c("Heads", "Tails"), вам не нужен replace = T, потому что вы рисуете только один из двух элементов.
  3. Я рекомендую сделать 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

Обратите внимание, что myCoinFlips составляет 2 порядкавеличина медленнее, чем у двух других методов.

0 голосов
/ 11 февраля 2019

У вас есть несколько проблем, которые скрыты вашим плохим отступом.

  1. count <- 0 должно быть вне вашей петли.
  2. Вы используете result как скаляр и вектор.Измените result[i] на result
  3. nFlips - это скаляр, поэтому length(nFlips) равно 1. Вам нужно for(i in 1:nFlips)

Пожалуйста, сделайте отступ в своем коде правильно, и он будетпомочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...