分配
你办公室里有一张table,有50%的机会可以放一欧元。这张table有三个抽屉。如果这张table里有一欧元,那么它同样可能在其中一个抽屉里。如果你已经在第一个和第二个抽屉里徒劳地寻找欧元,那么欧元在第三个抽屉里的概率是多少?
解决方案:
int iterations = 10000;
int desk;// 0 or 1 - 50%
int[] foundEuro = new int[5];
for (int i=1; i <= iterations; i++){
desk = (int) (Math.random() * 2);
if ( desk == 0){ // found Euro
int drawer = (int) (Math.random() * 3);
if ( drawer == 0){
foundEuro[drawer]++; // euro in drawer1
} else {
foundEuro[drawer]++; // euro in drawer2
foundEuro[drawer+1]++; // euro in drawer3
}
} else {
foundEuro[desk]++;
}
}
showResult(foundEuro);
float probability = ( ((float) foundEuro[0]) / iterations) * 100;
System.out.printf("%.2f%%", probability);
输出
抽屉1欧元:1638
抽屉2欧元:6622
3号抽屉里的欧元:3343
16,38%
笔记
我认为,我的代码没有错误,应该显示正确的结果,但idk如果它真的是正确的概率,找到欧元在第三个抽屉,而在其他前两个抽屉它不在那里。
3条答案
按热度按时间rqenqsqc1#
你的算法和结果是完全错误的。你所计算的基本上是硬币在table上给定抽屉里的概率,很明显是1/21/3,正确table的概率正确抽屉的概率=1/6,大约16.6
答案是25%。你可以在纸上计算出来,或者你可以调整你的程序来正确反映“如果你已经在第一和第二个约束中徒劳地搜索了它”。您基本上必须放弃那些违反此约束的随机硬币选择。然后代码变为:
25.05%
对代码的最小更改是将概率计算更改为
所涉及的数学是(cndm是桌上n抽屉里的硬币m=1/3*1/2=1/6,d0是桌上0=1/2的硬币):
piah890a2#
首先,你要决定欧元到底在不在桌上。如果我解释正确,一旦不正确,你就增加计数器
foundEuro[1]
,正如您在else子句中所做的,其中desk
保持值1。当抽屉2中有欧元时,这个完全相同的数组元素也会增加,所以66,22%的概率实际上是欧元在其他地方或抽屉2中,而不仅仅是在抽屉2中。另外,我不明白为什么你总是增加抽屉2和抽屉3的计数器,当drawer != 0
,您可能应该使用switch case语句。第二,我想你可以看看monty-hall问题,它可能是相关的,并给你一个如何处理这种统计问题的提示,因为我认为你的假设已经有缺陷了。你的问题不是关于代码,而是关于如何解决概率问题,所以不妨看看https://stats.stackexchange.com
qnzebej03#
在table上找到欧元的几率是50%,1/2。
如果你在三个抽屉中的任何一个都能找到。i、 在任何给定的抽屉中找到它的机会是(1/3)(1/2)=1/6。
在两个抽屉里找不到欧元的特殊情况有4/6的可能。它可能在1/6箱的第三个抽屉里,1/2=3/6箱的时候根本不在这张table里。这些机会并不重叠,因此可以相加,1/6+3/6=4/6。
你在第三个抽屉里发现欧元的几率,特别是在这种情况下,是(1/6)/(4/6)=1/4,因为这种情况的几率,乘以这种情况的几率,必须得到总几率,即(1/4)(4/6)=1/6。