2

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

我想使用HashSet.

现在,当我运行它时,collisionCount它比我预期的要低得多。首先,我预计collisionCount一组 10 人的 11446(或 0.11446 的概率)。然后当我达到 100 人时,我预计碰撞计数为 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);
    }
  }  
 }

我想我的问题是:我是否在我的任何一个 for 循环中都没有做正确的事情才能collisionCount正确计数?

我是学习 Java 的新手,也是 Stack Overflow 社区的新手,并且仍在学习中。非常感谢任何帮助/建议/提示。

4

2 回答 2

1

您的问题似乎是您缺少一个循环。

请注意,您的runs循环因第一次碰撞而中断。这意味着您的值永远不会超过 1。

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

你需要做的是运行你的模拟100_000时间。这样做的方法是在你的runs循环中放置逻辑来检查people人们是否会发生生日碰撞,然后迭代你的碰撞计数。

于 2015-04-10T02:47:15.533 回答
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

我试着帮助你,做一些伪代码。希望这对您有所帮助。

问候

阿图罗。

于 2015-04-10T02:52:47.457 回答