public static void main(String[] args) {
/*
* 由代码模拟操作,boxa、boxb、boxc分别代表3个箱子,以随机数来控制模拟无法透视;
* 总共循环模拟10万次,x代表第一次抽中红球的总数,y代表第一次抽中红球的前提下第二次又抽中红球的次数;
* 最终只要将y除以x就是:在已知第一次抽中红球的前提下,第二次又抽中红球的概率
* 注意:由于抽选这个动作是由随机数来模拟的,所有第一次抽中的是a还是b未知,第二次抽取只是从当前已选中的箱子里拿出另一个球
*/
String[] boxa = {"红球", "红球"};
String[] boxb = {"蓝球", "蓝球"};
String[] boxc = {"红球", "蓝球"};
int x = 0;
int y = 0;
// 将3个箱子放入数组里,通过随机数来模拟挑选箱子
String[][] arr = {boxa, boxb, boxc};
for (int i=0; i<100000; i++) {
// 取0到2中的一个随机数。获得箱子 (这个随机数是模拟选箱子)
int r = (int)(Math.random()*(3-1+1));
String[] strs = arr[r];
// 取0到1中的一个随机数。获得箱子中的一个球,如果是红球,则开始计取球总数,否则跳过 (这个随机数是模拟在箱子里选球)
r = (int)(Math.random()*(2-1+1));
String string = strs[r];
if (!StringUtils.equals(string, "红球")) continue; // 第一个球不是红球,不符合场景,不做任何操作跳过
// 第一个球选了红球,开始计数
x++;
// j为第二个球的下标
int j = 0;
if (r == 0) j = 1;
String str = strs[j];
if (StringUtils.equals(str, "红球")) // 记录第二次依然是红球的总次数
y++;
}
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("result = " + (float)y/(float)x);
}
执行结果:
x = 50125
y = 33393
result = 0.6661945
很明显,代码中总模拟操作次数为10万次,有效(第一次选中红球)次数为50125次,在有效前提下第二次又抽到红球的次数为33393次,两者相除结果为0.6661945,即2/3。
其实这道概率题很多人都认为结果应该是0.5,包括原来的我。主要考虑方向是什么呢?第一次选了红球已知,即剩余两个箱子,蓝+蓝的箱子已废;那么只剩2个箱子,而且既然已经拿出了一个红球,箱子是固定了,剩余的球只有2中可能,要么是红球要么是篮球,所以得出第二次还抽中红球的概率是1/2。
那么,问题出在哪里呢?个人觉得出在抽选对象错了。上述思路的根本其实不是在选球,而是选箱子,但是题目中问题的根本是选球,导致了最终答案的错误。