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());
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("----------------------");
}
}