三门问题代码

该程序通过并发执行模拟了门禁选择问题,即蒙提霍尔问题的实现。在100000次运行中,分别计算坚持选择和不坚持选择获胜的次数,最后展示获胜比例。程序使用了`ExecutorService`、`CountDownLatch`、`AtomicInteger`等并发工具类,展示了Java并发编程的基本用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.example.demo.xuanze;

import java.util.HashMap;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class A {

    // 坚持选择获胜的次数
    static AtomicInteger insistWinNum = new AtomicInteger(0);
    static AtomicInteger noInsistWinNum = new AtomicInteger(0);
    // 一共的运行次数
    static AtomicInteger runNum = new AtomicInteger(0);

    static final int DOOR_SIZE = 3;

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(DOOR_SIZE * 3);
        CountDownLatch countDownLatch = new CountDownLatch(DOOR_SIZE * 3);
        for (int i = 0; i < DOOR_SIZE * 3; i++) {
            executorService.execute(() -> {
                for (int i1 = 0; i1 < 100000; i1++) {
                    go();
                }
                countDownLatch.countDown();
            });
        }
        executorService.shutdown();
        countDownLatch.await();
        System.out.println("------------运行结束------------");
        System.out.println("一共运行" + runNum + "次");
        System.out.println("坚持选择获胜" + insistWinNum.get() + "次");
        System.out.println("不坚持选择获胜" + noInsistWinNum.get() + "次");
        System.out.println("坚持选择获胜比例" + (double) insistWinNum.get() / (noInsistWinNum.get() + insistWinNum.get()));
        System.out.println("不坚持选择获胜比例" + (double) noInsistWinNum.get() / (noInsistWinNum.get() + insistWinNum.get()));


    }

    private static void go() {
        // 记录次数
        int runNumInt = runNum.addAndGet(1);
        Random r = new Random(System.currentTimeMillis());
        // 定义三个门 0,1,2
        // key 是门,然后 value 对应的则是相应的 bool
        HashMap<Integer, Boolean> allDoor = new HashMap<>((int) (DOOR_SIZE / 0.75 + 1));
        for (int i = 0; i < DOOR_SIZE; i++) {
            allDoor.put(i, false);
        }
        // 随后我们随机把其中一个门设置为中奖的门
        int winningIndex = r.nextInt(DOOR_SIZE);
        allDoor.put(winningIndex, true);
        // 做出第一次选择
        int firstChoose = r.nextInt(DOOR_SIZE);

        // 随机排除一个没有奖的门
        int discardDoor;
        for (; ; ) {
            discardDoor = r.nextInt(DOOR_SIZE);
            if (discardDoor == firstChoose) {
                continue;
            }
            if (allDoor.get(discardDoor)) {
                continue;
            }
            break;
        }

        // 我们再在剩余的里面 做出一次选择
        int secondChoose;
        for (; ; ) {
            secondChoose = r.nextInt(DOOR_SIZE);
            if (discardDoor == secondChoose) {
                continue;
            }
            break;
        }

        // 这里进行结果的输出
        Integer winNumInt = null;
        Integer noInsistWinInt = null;
        if (secondChoose == firstChoose && allDoor.get(secondChoose)) {
            winNumInt = insistWinNum.addAndGet(1);
        }
        if (secondChoose != firstChoose && allDoor.get(secondChoose)) {
            noInsistWinInt = noInsistWinNum.addAndGet(1);
        }
        System.out.println("----------------------");
        System.out.println("第" + runNumInt + "次运行");
        System.out.println("第一次选择第为:" + firstChoose);
        System.out.println("第二次选择第为:" + secondChoose);
        System.out.println(allDoor.get(secondChoose) ? "未中奖" : "中奖");
        System.out.println("----------------------");
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值