Парадокс дня рождения - функция с входной переменной

Я пытаюсь смоделировать вероятность того, что более двух учеников имеют одинаковый день рождения в комнате, заполненной n людьми. В настоящее время я думаю, что мой код работает правильно, хотя сначала мне нужно просто запустить первую строку кода, чтобы выбрать мое значение n, а затем запустить остальную часть кода отдельно (см. Ниже).

n = as.integer(readline(prompt = "Enter the number of students in a room:"))

sims = 10000
x = numeric(sims)

for (i in 1:sims){
s = sample(1:365, n, replace=TRUE)
x[i] = n - length(unique(s))}

samebday = length(which(x>0))/length(x)
samebday

Как бы это привести в порядок, чтобы переменная n содержится в функции? Как только я пытаюсь преобразовать это в функцию следующим образом:

bday.prob = function(n){...}

тогда ошибки начинают происходить.

2 ответа

Решение

Если вы хотите использовать код, который вы написали ранее, и просто обернуть его в функцию, вы можете сделать это, n а также sims быть определяемыми пользователем входными переменными, такими как @42-.

Ниже мое решение с минимальными изменениями по сравнению с тем, что вы предоставили:

bday.prob = function(n, sims){
  #' @param n is the number of students in a room; user-defined
  #' @param sims is the number of trials; user-defined

  x = numeric(sims)
  for (i in 1:sims){
    s = sample(1:365, n, replace=TRUE)
    x[i] = n - length(unique(s))
  }
  samebday = length(which(x > 0))/length(x)
  return(samebday)
}

Используйте функцию следующим образом:

bday.prob(n=<User choice>, sims=<User choice>)

или же

bday.prob(n=as.numeric(readline(prompt = "Enter the number of students in a room:")), sims=100)
## Enter the number of students in a room: <User choice>

Вы, вероятно, не знали, что эта функция уже существует в пакете статистики:

pbirthday(30, classes = 365, coincident = 2)
[1] 0.7063162

Также есть квантильная версия: qbirthday

Оберните это в функцию, но не добавляйте параметр n в список аргументов, если вы также собираетесь делать внутри функции:

 # copied from my console
 bfun <- function(){ n = as.integer(readline(prompt = "Enter the number of students in a room:"))
+ print( pbirthday(n, classes = 365, coincident = 2) )
+ }
> bfun()
Enter the number of students in a room:30
[1] 0.7063162
Другие вопросы по тегам