java—如何证明这个算法给出了在table抽屉中找到欧元的正确概率?

odopli94  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(336)

分配
你办公室里有一张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如果它真的是正确的概率,找到欧元在第三个抽屉,而在其他前两个抽屉它不在那里。

rqenqsqc

rqenqsqc1#

你的算法和结果是完全错误的。你所计算的基本上是硬币在table上给定抽屉里的概率,很明显是1/21/3,正确table的概率正确抽屉的概率=1/6,大约16.6
答案是25%。你可以在纸上计算出来,或者你可以调整你的程序来正确反映“如果你已经在第一和第二个约束中徒劳地搜索了它”。您基本上必须放弃那些违反此约束的随机硬币选择。然后代码变为:

int iterations = 100000;
int found = 0;
int violateThePrecondition = 0;
for (int i = 1; i <= iterations; i++) {
    int desk = (int) (Math.random() * 2);
    if (desk == 0) { // found Euro
        int drawer = (int) (Math.random() * 3);
        if (drawer == 2) { // coin in drawer 2
            found++;
        } else { // drawers 0 and 1 can by definition not have the coin
            violateThePrecondition++;
        }
    }
}

float probability = (((float) found) / (iterations - violateThePrecondition)) * 100;
System.out.printf("%.2f%%", probability);

25.05%
对代码的最小更改是将概率计算更改为

float probability = ( ((float) foundEuro[0]) / (iterations - foundEuro[2])) * 100;

所涉及的数学是(cndm是桌上n抽屉里的硬币m=1/3*1/2=1/6,d0是桌上0=1/2的硬币):

P(c2d0 | !c1d0 and !c0d0) = 
P(c2d0 and (!c1d0 and !c0d0)) / P(!c1d0 and !c0d0) = 
    with (!c1d0 and !c0d0) = (!d0 or c2d0)
P(c2d0 and (!d0 or c2d0)) / P(!d0 or c2d0) =
P(c2d0) / (P(!d0) + P(c2d0)) =
1/6 / (1/2 + 1/6) =
1/6 / 4/6 =
1 / 4
piah890a

piah890a2#

首先,你要决定欧元到底在不在桌上。如果我解释正确,一旦不正确,你就增加计数器 foundEuro[1] ,正如您在else子句中所做的,其中 desk 保持值1。当抽屉2中有欧元时,这个完全相同的数组元素也会增加,所以66,22%的概率实际上是欧元在其他地方或抽屉2中,而不仅仅是在抽屉2中。另外,我不明白为什么你总是增加抽屉2和抽屉3的计数器,当 drawer != 0 ,您可能应该使用switch case语句。
第二,我想你可以看看monty-hall问题,它可能是相关的,并给你一个如何处理这种统计问题的提示,因为我认为你的假设已经有缺陷了。你的问题不是关于代码,而是关于如何解决概率问题,所以不妨看看https://stats.stackexchange.com

qnzebej0

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。

相关问题