版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
【题目描述】
桶中取黑白球
有一个桶,里面有白球、黑球各100个,人们必须按照以下规则把球取出来:
1、每次从桶中那两个球
2、如果是两个同色的球,那就再放入一个黑球
3、如果是两个异色的球,那就再放入一个白球
问:最后桶里面最后剩下一个球是白球和黑球的概率各是多少。
【思路解析】
思路一:归纳总结
依靠枚举的思路,比如假设黑白球各10个、5个、2个等来分析和推断,然后找规律。
分析过程可以参考《编程之美》第4.6节中的“桶中取黑白球”题。
思路二:连续异或
对桶中的球而言,取出2个球共有3种情况:
1、取出两个黑球,放回一个黑球
2、取出两个白球,放回一个黑球
2、取出一黑一白,放回一个白球
将上述的过程抽象成为数学上的异或运算:
1、2个黑球变成1个黑球 ==>1 ^ 1 = 1
2、2个白球变成1个黑球 ==>0 ^ 0 = 1
3、1白1黑变成1个白球 ==>1 ^ 0 = 1
在上述的抽象的过程中,主要利用了异或的性质:相同得0,不同得1。因此可以将同色时放入的黑球用0代替,异色时放入的白球用1代替。
由于异或运算满足结合律(a ^ b ^ c = a ^ (b ^ c))和交换律(a ^ b = b ^ c),那么就有
a ^ b ^ c = a ^ c ^ b = b ^ a ^ c = b ^ c ^ a = c ^ a ^ b = c ^ b ^ a
也就是异或结果与异或的顺序无关,任意的异或顺序最终计算的结果都是一致的。
桶中取出100个黑白球,不断取出2个球放回一个球,就是不断取出两个数异或,并将异或结果放回计算序列。也就是,将所有的数进行异或就是最终的结果。
例如有2个黑球和2个白球,就是1^ 1 ^ 0 ^ 0 = 0, 无论任何的取出顺序最终都将获得黑球(对应数字0)
那么,100个黑球和100个白球,也就是100个0和100个1连续异或的结果。连续异或结果是0,也就是最终剩下的一定是黑球。也就是剩下黑球的概率为100%,剩下白球的概率是0。
如果,是5个黑球和5个白球。