桶中黑白球问题
桶中黑白球问题 去年百度的笔试题目,网友说貌似是《编程之美》上面的题目。题目描述如下:
有一个桶,里面有白球、黑球各100个,取球的规则如下:
- 每次从桶里面拿两个球;
- 如果是两个同色的球,就再放入一个黑球;
- 如果是两个异色的球,就再放入一个白球。
问题是:最后桶里面只剩下一个黑球的概率是多少?
刚开始拿到题目,首先的思路就是写程序,计算每种情况的可能……可是这个程序怎么写都迷迷糊糊的,也算不出来正确结果。后来看了书和网上的资料,才发觉思维四位僵化居然这么可怕。
这道题目有两种比较好的解法,而且题目中球的数目不同的时候也会产生不同的结果。
解法一: 同色球,放入一个黑球,异色球,放入一个白球。由这两句话我们可得球的数量的变化,假设原先黑、白球各100个的状态是(0,0),则我们可以用(-2,0)、(0,-2)表示取出同色的球,则取出一黑一白就可以表示成(-1,-1),则我们可得球的数量的变化情况如下等式:
- 取出两个白球:(0,-2)+(1,0)=(1,-2);
- 取出两个黑球:(-2,0)+(1,0)=(-1,0);
- 取出一黑一白:(-1,-1)+(0,1)=(-1,0)。
由上式我们知道,每次取球,球的数量都是会减少一个的,所以最后必定会出现只剩下一个球的情况。然后我们观察发现白球数量的变化情况是要么少两个,要么就不变,所以最后肯定不会只剩下一个白球,那么肯定是只剩下一个黑球了,所以最后桶里面只剩下一个黑球的概率就是1.
解法二: 多读题目几遍,同色放入一个黑球,异色放入一个白球,这个是不是跟数学里面的异或规律很像。假设我们把黑球看成是0,白球看成是1,就很符合题目要求,即: 1 XOR 1=0; 0 XOR 0=0; 1 XOR 0=1。 正如题目所说,取两个就会放一个进去,放进去的球还是有可能再被取出来。假设我们就把取球过程看成是不断的XOR运算过程,则因为XOR运算是满足结合律和交换律的,则我们就可以把这100个白球和100个黑球取出放回的过程看成:
(0 XOR 0 XOR 0……0 XOR 0 XOR 0) XOR (1 XOR 1 XOR 1……1 XOR 1 XOR 1)=0。
即最后的结果一定是0(黑球),则所求的概率就是1.
由解法二中的异或等式我们可以得到,最后所得的结果取决于1(白球)的个数,若1(白球)个数是偶数,则结果为0(黑球),若1(白球个数为奇数,则最后的结果就是1(白球)。
通过这个题目,我们在考虑问题的时候不要一味的思维僵化,不能由问题去看问题,最后把自己都绕进去了,要跳出问题圈子,从远处看问题,这样才能看出问题的真正解决办法。