Java Monty Hall 模拟,结果为 0.61

问题描述 投票:0回答:1

我正在尝试 Java 代码来模拟著名的 Monty Hall 问题

enter image description here

运行代码 100.000 次迭代返回的平均值为 0.61,而不是 0.66。我找不到我的代码有什么问题。

public static double MontyHall(int numTests) {
        int passedTests = 0;
        for(int i = 0; i < numTests; ++i) {
            List<Integer> puertas = new ArrayList<>(Arrays.asList(0,0,0)); //0wrong door, 1right door, -1opened door
            SecureRandom random = new SecureRandom();
            int rightDoor = random.nextInt(3);
            puertas.set(rightDoor, 1);
            int choice = random.nextInt(3);
            if(rightDoor == choice) {
                int aux = random.nextInt(2);
                for(int k = 0; k < puertas.size(); ++k) {
                    if(k != rightDoor && aux == 0) {
                        puertas.set(k, -1);
                    }
                    else if(k != rightDoor) --aux;
                }
            } 
            else {
                for(int j = 0; j < puertas.size(); ++j) {
                    if(j != rightDoor && j != choice) puertas.set(j, -1); 
                }
            }   
            for(int l = 0; l < puertas.size(); ++l) {
                if(l != choice && puertas.get(l) != -1) choice = l;  
            }
            if(puertas.get(choice) == 1) ++ passedTests;
        }
        return (double) passedTests /numTests;
    }

我用 numTests 为 100.000 运行它,结果是:

0.61116
0.61065
0.61111

如有任何帮助,我们将不胜感激,提前谢谢您。

java simulation
1个回答
0
投票

您的代码中有两个错误,都是由于循环中缺少

break
语句造成的。

第一个在

rightDoor
choice
为1且
aux
为0时触发。
k
循环打开门0和2,这导致
l
循环永远不会更新
choice
,产生误报。

第二个是

l
循环本身。当
choice
切换到较低的可用门时,循环继续并发现
l != choice
对于原始值再次为真,并将其切换回来,反转这些情况的实验。

j
循环是无害的,因为只有一扇门既不是
rightDoor
也不是
choice
。但继续迭代还是浪费周期。

© www.soinside.com 2019 - 2024. All rights reserved.