一个概率游戏
一个抽奖活动,有三扇门,只有一扇门后面有奖品。
如果你打开的门后面有奖品,那么就能赢得它。
你只有一次打开门的机会。
现在,你选择了其中的一扇门刚想打开,
主持人说等一下,然后打开了一扇你没有选择的门,那门后面什么都没有。
这时主持人问你,你需要改变你的选择吗?
你该如何选择才最有利呢?
答案是改变你的选择,最有利。最初你的选择的成功率是33.3%,另两个门的成功率为66.6%,当主持人去除那两门中错误那扇后,你改变选择就有66.6%成功率了。
下面是用一个程序来模拟实际的情况,试了100万次,改变选择后的成功次数是666592次,成功率在66.6%,不改变选择后的成功次数是333418次,成功率在33.3%,有前面的理论一致。
以下是运行的代码。
import java.util.Random;
public class Lottery {
public static void main(String[] args) {
int resistWinNum = 0;
int changeWinNum = 0;
int total = 1000000;
for (int i = 0; i < total; i++) {
Door door = new Door();
int selected = Door.getRandom();
int wrong = door.getWrong(selected);
int other = getOther(selected, wrong);
if (door.isWin(selected))
resistWinNum++;
if (door.isWin(other))
changeWinNum++;
}
System.out.println("changeWinNum=" + changeWinNum + " "
+ (changeWinNum * 100 / total) + "%");
System.out.println("resistWinNum=" + resistWinNum + " "
+ (resistWinNum * 100 / total) + "%");
}
//改变选择
public static int getOther(int selected, int wrong) {
for (int i = 0; i < 3; i++) {
if (i != wrong && i != selected)
return i;
}
throw new IllegalStateException();
}
}
class Door {
boolean doors[] = { false, false, false };
// 在一扇门后面放奖品
public Door() {
doors[getRandom()] = true;
}
// 主持人给出一个错误答案
public int getWrong(int selected) {
while (true) {
int r = getRandom();
if (doors[r] == false && r != selected)
return r;
}
}
// 是否中奖
public boolean isWin(int selected) {
return doors[selected];
}
//
private static Random random = new Random();
// 随机选择
public static int getRandom() {
return random.nextInt(3);
}
}
如果你打开的门后面有奖品,那么就能赢得它。
你只有一次打开门的机会。
现在,你选择了其中的一扇门刚想打开,
主持人说等一下,然后打开了一扇你没有选择的门,那门后面什么都没有。
这时主持人问你,你需要改变你的选择吗?
你该如何选择才最有利呢?
答案是改变你的选择,最有利。最初你的选择的成功率是33.3%,另两个门的成功率为66.6%,当主持人去除那两门中错误那扇后,你改变选择就有66.6%成功率了。
下面是用一个程序来模拟实际的情况,试了100万次,改变选择后的成功次数是666592次,成功率在66.6%,不改变选择后的成功次数是333418次,成功率在33.3%,有前面的理论一致。
以下是运行的代码。
import java.util.Random;
public class Lottery {
public static void main(String[] args) {
int resistWinNum = 0;
int changeWinNum = 0;
int total = 1000000;
for (int i = 0; i < total; i++) {
Door door = new Door();
int selected = Door.getRandom();
int wrong = door.getWrong(selected);
int other = getOther(selected, wrong);
if (door.isWin(selected))
resistWinNum++;
if (door.isWin(other))
changeWinNum++;
}
System.out.println("changeWinNum=" + changeWinNum + " "
+ (changeWinNum * 100 / total) + "%");
System.out.println("resistWinNum=" + resistWinNum + " "
+ (resistWinNum * 100 / total) + "%");
}
//改变选择
public static int getOther(int selected, int wrong) {
for (int i = 0; i < 3; i++) {
if (i != wrong && i != selected)
return i;
}
throw new IllegalStateException();
}
}
class Door {
boolean doors[] = { false, false, false };
// 在一扇门后面放奖品
public Door() {
doors[getRandom()] = true;
}
// 主持人给出一个错误答案
public int getWrong(int selected) {
while (true) {
int r = getRandom();
if (doors[r] == false && r != selected)
return r;
}
}
// 是否中奖
public boolean isWin(int selected) {
return doors[selected];
}
//
private static Random random = new Random();
// 随机选择
public static int getRandom() {
return random.nextInt(3);
}
}
还没人赞这篇日记