【问题标题】:Monty Hall lets make a deal Simulation in java (10000 iterations)Monty Hall 让我们在 Java 中进行交易模拟(10000 次迭代)
【发布时间】:2015-10-08 18:58:55
【问题描述】:

我要创建一个运行 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;
            }
        }
    }
}

【问题讨论】:

  • 请提供可运行且可验证的代码,您的代码无法编译。
  • 为什么要保留zonk计算?你不再使用它了。并且不需要括号,即使数字是双倍的。
  • 而且您永远不会更新 noSwitch 变量。反正没必要。
  • 只有当奖品=选择门时才使用switch方法,所以如果选择的门不等于奖门,我是否还需要它?

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


【解决方案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++;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多