概率题之黑白球问题
作者:互联网
问题
题目:有一个桶,里面有白球、黑球各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个,现在按下述规则取球
标签:bin,概率,运算,黑白,异或,问题,黑球,白球,100 来源: https://blog.csdn.net/weixin_44607838/article/details/117932243