4.5 桶中取黑白球
基本问题:
有一个桶 里面有白球和黑球各100个,你必须按照以下规则将球取出来
- 1 每次从桶中拿出来两个球
- 2 如果是两个同颜色的球,就在放入一颗黑球
- 3 如果是两个异色的球,就在放入一个白球
问:最后桶里面只剩下一个黑球的概率是多少?
解法
解法1:数学分析
解法2:位运算
拓展问题:
1 如果桶中球的个数,黑球与白球各为99个,那么结果会是怎样?
对所有的球进行异或,最后的异或结果是1,也就是说,最后会剩下一个白球。
2 如果黑白球的数量不定,那么结果又怎样?
我们其实就不用太在意球的数量,只需要在乎异或的结果。
// 4.5 桶中取黑白球
class Test{
public static void main(String[] args) {
/**
基本问题:
有一个桶 里面有白球和黑球各100个,你必须按照以下规则将球取出来
1 每次从桶中拿出来两个球
2 如果是两个同颜色的球,就在放入一颗黑球
3 如果是两个异色的球,就在放入一个白球
问:最后桶里面只剩下一个黑球的概率是多少?
> answer 1
*/
/**
解法1:
从桶中取出球,只可能是进行下列三种操作之一:
1 : 取两黑,放回一黑 : (-2,0) + (1,0) = (-1,0)
2 : 取两白,放回一黑 : (0,-2) + (1,0) = (1,-2)
3 : 取一黑一白,放回一白 : (-1,-1) + (0,1) = (-1,0)
根据上面的规则可以看出:
1 : 每次都会减少一个球,最后的结果一定是只剩余一个球,要么是黑球,要么是白球
2 : 每次拿球之后,白色数量要么不变,要么减少两个
从上面的分析可以看出,最后不可能只剩下一个白球,那么剩下的一定是黑球
解法2:
黑球为0,白球为1,就相当于异或操作 1(white) ^ 0(black) = 1(white) , 0(black) ^ 0(black) = 0(black) , 1(white) ^ 1(white) = 0(black)
而且又因为异或满足结合律与交换率,所以取球的过程也就相当于将桶中的球进行异或操作的过程?
因此,剩下一个球的时候,桶中的权值就等于所有球的异或结果,一定为0
*/
/**
拓展问题:
1 如果桶中球的个数,黑球与白球各为99个,那么结果会是怎样?
对所有的球进行异或,最后的异或结果是1,也就是说,最后会剩下一个白球。
2 如果黑白球的数量不定,那么结果又怎样?
我们其实就不用太在意球的数量,只需要在乎异或的结果。
*/
}
}