Monty Hall让我们在java中进行模拟(10000次迭代)

时间:2015-10-08 18:58:56

标签: java if-statement switch-statement logic probability

我要创建一个运行Monty Hall的程序,让它成交10000次并输出以下统计数据:

  • 胜利与失败的数量
  • 玩家切换和赢得的次数与停留的次数 获奖。
  • 显示转换和停留时胜利与损失的百分比。
切换时,切换和获胜与停留和获胜的期望输出应该在2/3左右。即将到来,但只有一半;转换时为33%,入住时为16%。我不知道为什么其他50%没有出现。 很确定它与我的第二个switch语句有关,但无法解决(可能是由于睡眠不足)。

我做错了什么?提前谢谢。

package pic;

import java.util.Scanner;

public class PartAB {
    public static void main(String[] args) {
        System.out.println("WELCOME TO 'LETS MAKE A DEAL'");
        System.out
                .println("Please Enter 'A' to Play, 'B' To Watch, or 'Q' To Quit");
        Scanner input = new Scanner(System.in);
        String choice = input.next();

        boolean done = false;
        double wins = 0;
        double games = 0;
        double switches = 0;
        double noSwitch = 0;
        int iterations;
        for (iterations = 0; iterations < 10000; iterations++) {
            int prizeIs = (int) ((Math.random() * 3) + 1);
            int compChoice = (int) ((Math.random() * 3) + 1);
            int zonkIs = 0;
            if (prizeIs == compChoice) {
                boolean chooseFirstZonk = Math.random() < 0.5; // 50% chance
                switch (prizeIs) {
                case 1:
                    if (chooseFirstZonk) {
                        zonkIs = 2;
                    } else {
                        zonkIs = 3;
                    }
                    break;
                case 2:
                    if (chooseFirstZonk) {
                        zonkIs = 1;
                    } else {
                        zonkIs = 3;
                    }
                    break;
                case 3:
                    if (chooseFirstZonk) {
                        zonkIs = 1;
                    } else {
                        zonkIs = 2;
                    }
                    break;
                }
            } else if (prizeIs == 1 && compChoice == 2) {
                zonkIs = 3;
            } else if (prizeIs == 1 && compChoice == 3) {
                zonkIs = 2;
            } else if (prizeIs == 2 && compChoice == 1) {
                zonkIs = 3;
            } else if (prizeIs == 2 && compChoice == 3) {
                zonkIs = 1;
            } else if (prizeIs == 3 && compChoice == 1) {
                zonkIs = 2;
            } else if (prizeIs == 3 && compChoice == 2) {
                zonkIs = 1;
            }

            // generating a 1 or 2 to decide whether to switch doors or not
            int switchDoor = (int) (1 + (Math.random() * 2));

            switch (switchDoor) {
            // not switching doors
            case 1: {
                // since we didnt switch
                // if compchoice == prize
                // then thats considered a win
                // for not switching
                if (compChoice == prizeIs) {
                    noSwitch++;
                    wins++;
                    games++;
                }
                // if we didnt win
                // the games will be incremented by 1
                // later to use to calculate the losses
                else {
                    games++;
                }
            }
                break;
            // switch door
            case 2: {
                // since we did switch
                // if compchoice == prize
                // then thats considered a loss
                // because were switching
                // to the door that has a zonk
                if (compChoice == prizeIs) {
                    games++;
                }

                // if compchoice != prize
                // then thats considered a win
                // because were switching from the door
                // with a zonk to the door with the prize
                else if (compChoice != prizeIs) {

                    switches++;
                    wins++;
                    games++;
                }

            }
            }
            if (iterations == 10000) {

                double percentage = 100.0 * (switches / games);
                double noswitchpercentage = 100.0 * (noSwitch / games);
                System.out.println("Switch percentage : " + percentage);
                System.out.println("No Switch percentage : "
                        + noswitchpercentage);
                System.out.println("wins : " + wins);
                System.out.println("losses : " + (games - wins));
                break;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您在纠正的switch (switchDoor)代码段中可能会出现一些逻辑错误

switch (switchDoor) {

case 1: {

    if (compChoice == prizeIs) {
        noSwitch++;
        wins++;
        games++;
    }
    else {
        games++;
        switches++;  //This should be added, game incremented but switch or noswitch can not. 50% time may this happens.
                    // If we chose no Switch and loose that means switches should be right choice and get incremented.

    }
}
    break;

case 2: {
    if (compChoice == prizeIs) {
        games++;
        noSwitch++; //Same as previous logic
    }
    else if (compChoice != prizeIs) {

        switches++;
        wins++;
        games++;
    }

}