生日问题,平均人数

nop*_*ens 5 java

我正在尝试解决此作业:

假设人们进入一个空房间,直到一对人共同过生日。平均而言,一场比赛之前,有多少人必须进入?运行实验以估算此数量的价值。假设生日是0到364之间的统一随机整数。

平均值是24.61659。有关数学,请参见此维基百科页面。生日问题

我的方法:

  • 生成范围为[0-364]的随机数
  • 将它们添加到集合中,直到生成重复项为止(set.add返回false)
  • 将计数(或设置大小)添加到列表
  • 重复这个X次
  • 计算列表的平均值

码:

public static void main(String[] args) {        
    List<Integer> list = new ArrayList<>();
    for(int i = 0; i<10000; i++){
        int count = 0;
        Set<Integer> set = new HashSet<>();
        while(set.add(ThreadLocalRandom.current().nextInt(0, 365))){
            count++;
        }
        list.add(count);
    }
    double avg = list.stream().mapToInt(Integer::intValue).average().getAsDouble();
    System.out.println(avg);
}
Run Code Online (Sandbox Code Playgroud)

我的输出始终低于24。例如23.6285

  • 我试图运行for循环1000、10000、1000000次
  • 我试过ThreadLocalRandom.current().nextInt(0, 365)nextInt(0, 364)nextInt(0, 366)
  • 我试着list.add(count);list.add(set.size());

但是我总是平均低于24。主要是23.629237。

您是否看到任何错误以及为什么我没有得到正确的值(大约)。?24.61659

ysh*_*vit 10

请注意,您的答案几乎比预期值少1。这是一个线索:它告诉您您可能低估了1,这是一个非常常见的错误

考虑您的情况:

while(set.add(<newPersonsBirthday>)){
    count++;
}
Run Code Online (Sandbox Code Playgroud)

那算不上最后一个人!它们不会被添加到计数中,因此您不会将它们包括在会议室中的所有人员中。您已经计算了集合中触发比赛的人以外的所有人-但他们是集合中的一部分。

只需添加count + 1到您的列表中,即可说明该人。