4.5 桶中取黑白球

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 如果黑白球的数量不定,那么结果又怎样?
			我们其实就不用太在意球的数量,只需要在乎异或的结果。
		*/
		
	}
}
上一篇:Java 红黑树(Red-Black tree)


下一篇:Python骚操作从列表推导和生成器表达式开始