使用HashSet对生日悖论进行蒙特卡罗分析

时间:2015-04-10 01:32:21

标签: java for-loop hashset montecarlo birthday-paradox

免责声明:我不想回答这个问题。我只需要一些指导。

我希望使用HashSet对臭名昭着的生日悖论(确定特定群体中至少2个人共享同一个生日的概率)进行蒙特卡洛分析。

现在当我运行时,collisionCount比我预期的要低。首先,我期待一组10人的collisionCount为11446(或者概率为0.11446)。然后当我到达100人时,我期待collisionCount为100,000(概率为1.0)。但相反,对于每10个人,collisionCount只计数1(10人:1次碰撞,20人:2次碰撞,30次人员:3次碰撞等)。

这是我到目前为止编写的代码:

import java.util.HashSet;
import java.util.Random;
import java.util.Set;


public class BirthdayParadox
{
public static void main(String [] args)
{
    Random rand = new Random();


    int tests = 100000;
    int collisionCount = 0;

    for(int people = 10; people <= 100; people += 10)
    {
        Set<Integer> birthdays = new HashSet<>(365);
        birthdays.add(rand.nextInt(365));
        for(int runs = 0; runs < tests; runs++)
        {
            int randomBirthday = rand.nextInt(365);

            if(birthdays.contains(randomBirthday))
            {
                collisionCount++;
                break;
            }
            birthdays.add(randomBirthday);
        }
        float prob = (float)collisionCount / tests;

            System.out.println("After " + tests + " tests there were " +
                               collisionCount + " occurrences of shared " +
                               " birthdays in a set of " + people + " people.");
            System.out.println("Probability : " + prob);
    }
  }  
 }

我想我的问题是:为了让collisionCount正确计数,我是不是用我的for-loops做了一些事情?

我是学习Java的新手,我是Stack Overflow社区的新手,我还在学习绳索。非常感谢任何帮助/建议/提示。

2 个答案:

答案 0 :(得分:1)

您的问题似乎是您错过了一个循环。

请注意,第一次碰撞会破坏您的runs循环。这意味着您的价值永远不会超过1.

此外,除非输出结果,否则永远不要在内循环中使用people变量。

您需要做的是运行模拟100_000次。这样做的方法是在runs循环中放置逻辑,检查people人是否会发生生日碰撞,然后重复碰撞计数。

答案 1 :(得分:0)

我认为java解决方案并不是最好的,这可能是你在模拟和数学值之间存在差异的问题。我对这个问题的理解是你必须确定一组10人(在这种情况下)中有多少人共享同一个生日。要做到这一点,你必须随机输入一个10的数组,其数字从0到365(一年中的几天)并计算它们中有多少是相同的。你必须要做好几次(在你的情况下为100000)。 我认为你必须反转FOR命令。我的意思是..

for(int runs = 0; runs < tests; runs++)
{
    //initialize an array of 10
    for(int people = 0; people <= 10; people +=1)
    {
        //random birthdayDay
        //array [people] = rand.nextInt(365);

    }
    //check if there is a collision
    //If there is one you have to increase you success variable in 1   
 }
 //calculate the probability

我尽力帮助你,做一些伪代码。 希望这对你有所帮助。

此致

的Arturo。