1

我试图模拟两个以上的学生在一个满是 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){...}

然后错误开始发生。

4

2 回答 2

3

你可能不知道这个函数已经存在于 stats 包中:

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

还有一个分位数版本:qbirthday

将其包装在一个函数中,但n如果您还打算在函数内部执行 einlut,请不要将参数添加到参数列表中:

 # 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
于 2017-02-25T17:05:34.480 回答
1

如果您想使用之前编写的代码并将其简单地包装到一个函数中,您可以通过 letnsimsbe 用户定义的输入变量来实现,例如 @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>
于 2017-02-25T17:19:02.580 回答