桶中有n个黑球,n个白球,取球规则如下:每次从桶中取两个球,如果两球同色,则放回一个黑球,否则放回一个白球。
问:最后桶中剩下一个黑球的概率是多大?
分析取球的规则,每次取完球之后,黑球的数量要么增1,要么减1,白球的数量要么不变,要么减2。
如果说桶中只剩下一个球,鉴于白球的递减是以2为倍数,所以,当n为奇数时,桶中剩下的一定是白球,当n为偶数时,桶中剩下的一定是黑球。
编程之美中,作者提出了用异或的数学逻辑来模拟取球的过程,黑球看作是0,白球看作是1,这样的话,取球规则就相当于把取出的数字异或之后再把结果丢回去。
0 XOR 0 =0
1 XOR 1 =0
0 XOR 1 =1
这样以来,每次取完数字之后,所有数字的异或的结果是不变的,要么是0,要么是1。当1的个数为奇数时,奇数个1的异或结果是1,偶数个1的异或结果为0,0的个数不影响异或结果。
所以,把1和白球对应起来,得出的结论是当有奇数个白球时,桶中剩下的一个一定是白球,当白球的个数为偶数时,桶中剩下的一个一定是黑球。
note:编程之美中的问题中给出的n为100,我们很容易就从100个黑白球从头开始分析,想着怎么样模拟取球的过程,能够递归到桶中只剩一个黑球的情形,然后陷入到复杂的穷举当中去,
我刚开始就是这么干的,搞了一个下午,还写了个程序去跑,结果是程序没跑出结果来,原因是穷举的规模太大了,当n为100的时候,穷举的规模大概为3199。
so,一开始就应该有个正确的思路,考虑穷举是不可行的,应该从取球的规则中挖掘规律,原来,就这么简单,吼啊x。