Я работаю через Digital Dice Пола Нахина , чтобы научить себя симуляциям Монте-Карло. Я преобразую код Matlab в книге в код R на первом проходе, а затем заменяю циклы for на аккуратные версии на втором проходе.
Редактировать: вот что я ищу модель:
- Представьте, что вы сталкиваетесь с поп-викториной, списком из 24 президентов 19-го века и еще одним списком их членов в должности, но в замешательстве
- Цель состоит в том, чтобы сопоставить президента с термином
- Вы получаете одно предположение каждый раз
- В среднем, сколько вы думаете, правильно?
Вот код R, использующий циклы for:
m <- 24
total_correct <- 0
n <- 10000
for (i in 1:n) {
correct <- 0
term <- sample(m, replace = TRUE)
for (j in 1:m) {
if (term[j] == j) {
correct <- correct + 1
}
}
total_correct = total_correct + correct
}
total_correct <- total_correct / n
print(total_correct)
Это работает (но я признаю, что дает неправильный ответ). Далее нужно привести в порядок это - это моя попытка:
crossing(trials = 1:10,
m = 1:24) %>%
mutate(guess = sample.int(24, n(), replace = F), result = m == guess) %>%
summarise(score = sum(result) / n())
Однако я получаю сообщение об ошибке, читающее Error in sample.int(x, size, replace, prob): cannot take a sample larger than the population when 'replace = FALSE'
.
Я понимаю, что происходит: команда n()
в операторе mutate()
возвращает 240. Выборка 240 из совокупности 24 с replace = FALSE
не имеет смысла, поэтому появляется сообщение об ошибке.
Как получить оператор mutuate()
для получения размера 24 на каждую итерацию (или пробную версию)?