使用ArrayList计算生日悖论的Java代码结果不符预期,求问题排查
问题分析与修复方案
嘿,我一眼就揪出问题所在了!你的matchBirthday方法逻辑完全跑偏了——它只在相邻的两个人之间比对生日,而生日悖论的核心是要检查所有两两组合的生日是否重复,这就是为啥你的测试结果远低于理论值的关键原因。
错误点详解
原来的matchBirthday方法里,循环只做了students.get(i)和students.get(i+1)的比对:
for(int i = 0; i < students.size() - 1; i++) { if(students.get(i).getBirthday() == students.get(i + 1).getBirthday()) { return true; } }
这种写法只会检查连续相邻的生日,比如第1个和第2个、第2个和第3个,但完全漏掉了第1个和第3个、第1个和第4个这类跨位置的组合,自然会少算大量存在重复生日的情况,导致计算出的概率严重偏低。
修复后的代码
把matchBirthday方法改成嵌套循环,覆盖所有两两组合:
public boolean matchBirthday(ArrayList<Person> students) { // 遍历每个学生 for(int i = 0; i < students.size(); i++) { // 和当前学生之后的所有学生比对生日 for(int j = i + 1; j < students.size(); j++) { if(students.get(i).getBirthday() == students.get(j).getBirthday()) { return true; } } } return false; }
这个嵌套循环会确保每一个学生都和他之后的所有学生做生日比对,不会漏掉任何可能的重复组合。
验证建议
你可以测试下经典的23人场景:理论上这个人数下存在重复生日的概率约为50%。修复后运行7000次测试,结果应该会接近这个理论值,而不是之前的7%左右。
内容的提问来源于stack exchange,提问作者Jacob Parratto
相关产品推荐
相关产品推荐

