概率题之黑白球问题

问题

题目:有一个桶,里面有白球、黑球各100个,人们必须按照以下的规则把球取出来:
1、每次从桶里面拿出来两个球;
2、如果是两个同色的球,就再放入一个黑球;
3、如果是两个异色的球,就再放入一个白球;
问:最后桶里面只剩下一个黑球的概率是多少?

思路

我开始遇到这道题时是懵逼的,因为用常规的方法比如推导概率公式是很难求解的。合理的思路有两种,下面我来分别介绍一下。

1.找规律
使用D=(黑球变化数,白球变化数)来记录每一轮拿球放球后两类球的变化情况。

情况1.从桶里拿出两个黑球,那么意味着放入一个黑球。因此D=(-1,0)
情况2.从桶里拿出两个白球,那么也意味着放入一个黑球。因此D=(1,-2)
情况3.从桶里拿出一白一黑,那么意味着需要放入一个白球。因此D=(-1,0)

仔细观察上面的各种情况,我们会发现,无论何种情况,每一轮白球要么不变要么少2个,那么我们再回顾一下题目中的信息,白球个数为100个,意味着无论如何都不可能出现最后剩下一个白球的情况,也就是说最后一个生剩下的一定是黑球。即只剩下一个黑球的概率是100%。

2.将该问题考虑成XOR(异或问题)
对于x,y,异或(^)运算有如下结果
在这里插入图片描述
如果我们把题目中的黑球看作0,白球看作1。每一轮拿两颗球的过程就可以看作对应数字的异或运算,而每一次放球的过程就可以看作是异或运算的结果。比如拿出两颗黑球,就可以表示为0^0,结果就是0,表示放入一颗黑球。

根据题意,我们的桶中存在100颗黑球以及100颗白球,也就等价于100个0和100个1做异或运算,对于异或运算而言,一个很好的特性就是交换律,即对于给定数量的0,1,无论以何种顺序进行运算,结果都不变。也就保证了题目中的随机取球并不影响最终结果。

因此,对于100颗白球和100颗黑球,无论取球的过程如何,都可以等价为先将100个黑球(0)做异或运算,再去和100个白球(1)做异或运算的结果做异或。

事实上,我们可以总结如下规律:
a.偶数个0做异或运算的结果为0
b.奇数个0做异或运算的结果为0
c.偶数个1做异或运算的结果为0
d.奇数个1做异或运算的结果为1

因此上面问题的结果为0^0=0,也就是最终为黑球。

下面我用python写了段代码来模拟上面的取球放球个数,并统计最后剩余一颗黑球的概率情况。和预期一样,无论实验多少次,最终结果都是剩余一颗黑球。

import random
from tqdm import tqdm
#100个黑球(0),100个白球(1)
bin_=[0]*100+[1]*100

n=100000
count=0
for i in tqdm(range(n)):
	while len(bin_)>1:
		out=random.sample(bin_,2)
		#拿出两颗球
		bin_.remove(out[0]) 
		bin_.remove(out[1])

		#加入一颗球
		if out[0]==out[1]:
			bin_.append(0)
		else:
			bin_.append(1)
	
	#while循环结束意味着bin_中只剩一颗球
	if bin_[0]==0:
		count+=1

print('最后一颗为黑球的概率为',count/n)

结果如下
在这里插入图片描述

参考:《编程之美》的概率题:一个桶里面有白球、黑球各100个,现在按下述规则取球

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值