java程序模拟红篮球概率事件

 

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。

那么,问题出在哪里呢?个人觉得出在抽选对象错了。上述思路的根本其实不是在选球,而是选箱子,但是题目中问题的根本是选球,导致了最终答案的错误。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值