首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法中断R中的while循环

无法中断R中的while循环
EN

Stack Overflow用户
提问于 2016-05-27 09:36:49
回答 2查看 1.1K关注 0票数 1

我的代码的目的是找出至少有两个人生日相同的概率为50%的人数。

代码语言:javascript
运行
复制
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。

EN

Stack Overflow用户

发布于 2016-05-27 18:32:28

如果代码的目的只是定义至少两个人相同生日的概率在0.5以上时的人数,则可以用更简单的方式编写:

代码语言:javascript
运行
复制
# 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)
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37473455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档