我的代码的目的是找出至少有两个人生日相同的概率为50%的人数。
source('colMatches.r')
all_npeople = 1:300
days = 1:365
ntrials = 1000
sizematch = 2
N = length(all_npeople)
counter = 1
pmean = rep(0,N)
while (pmean[counter] <= 0.5)
{
  npeople = all_npeople[counter]
  x = matrix(sample(days, npeople*ntrials, replace=TRUE),nrow=npeople,
             ncol=ntrials)
  w = colMatches(x, sizematch)
  pmean[counter] = mean(w)
  counter = counter + 1
}
s3 = toString(pmean[counter])
s2 = toString(counter)
s1 = "The smallest value of n for which the probability of a match is at least 0.5 is equal to "
s4 = " (the test p value is "
s5 = "). This means when you have "
s6 = " people in a room the probability that two of them have the same birthday is 50%."
paste(s1, s2, s4, s3, s5, s2, s6, sep="")当我运行这段代码时,我得到的结果是“匹配概率至少为0.5的n的最小值等于301 (测试p值为NA)。这意味着当一个房间里有301个人时,其中两个人生日相同的概率为50%。”因此,由于某些原因,while语句不能正常工作。即使当all_npeople不再小于或等于0.5时,它也会停止循环。
我知道pmean正在正确更新,因为当我后来测试它时,pmean50 = 0.971。所以这个列表确实是正确的,但是while循环仍然不会结束。
*colmatches是一个函数,它根据sizematch确定列是否具有一定数量的匹配。因此,在本例中,对于至少有2个相似值的每一列,它查看x和清单1中定义的矩阵,对于没有匹配的每一列,查找0。
发布于 2016-05-27 18:32:28
如果代码的目的只是定义至少两个人相同生日的概率在0.5以上时的人数,则可以用更简单的方式编写:
# note that probability below is probability of NOT having same birthday
probability <- 1
people <- 1
days <- 365
while(probability >= 0.5){
    people <- people + 1
    probability <- probability * (days + 1 - people) / days
}
print(people)https://stackoverflow.com/questions/37473455
复制相似问题