免责声明:我不想回答这个问题。我只需要一些指导。
我希望使用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社区的新手,我还在学习绳索。非常感谢任何帮助/建议/提示。
答案 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。