Java “三门问题“ 测试代码

165 阅读1分钟

刷抖音看到"三门问题",没理解,就写了代码来测

import java.util.Random;

/**
 * @author: Fancg
 * @date: 2020-08-17 21:31
 * @describe: TODO
 **/
public class ThreeDoor {

    public static void main(String[] args) {
        chooseTheDoor(1_000_000,false);
        chooseTheDoor(1_000_000,true);
    }
    /**
     *
     * @param total 测试次数
     * @param isChange 是否换门
     */
    public static void chooseTheDoor(final int total,final boolean isChange){
        //正确计数
        int rightCount = 0;
        //定义一个伪随机数组0是正确,1是错误
        String[] door = new String[]{"011", "101", "110"};
        for (int i = 0; i < total; i++) {
            //生成一个长度为3的数组,模拟3门
            String[] d = door[new Random().nextInt(3)].split("");
            int[] doors = {Integer.parseInt(d[0]), Integer.parseInt(d[1]), Integer.parseInt(d[2])};
            //模拟选中一个门,记录下标
            int selected = new Random().nextInt(3);
            //模拟在未选择的两个门中,选择其中一个错误的排除
            int exclude = 0;
            for (int x = 0; x < doors.length; x++) {
                if (x != selected) {
                    if (doors[x] == 1) {
                        exclude = x;
                        break;
                    }
                }
            }
            //selected+exclude+canChange=3 算出可以换的门的下标
            int canChange = 3-exclude-selected;
            //结果
            if (doors[isChange?canChange:selected] == 0 ? true : false){
                rightCount++;
            }
        }
        System.out.println(String.format("是否换门:%s,总数:%d,正确次数:%d,正确率:%s",isChange==true?"是":"否",total,rightCount,rightCount/(total*1.0d)));
    }
}

结果如下: