题目:有一个桶,里面有白球、黑球各100个,人们必须按照以下的规则把球取出来:
1、每次从桶里面拿出来两个球;
2、如果是两个同色的球,就再放入一个黑球;
3、如果是两个异色的球,就再放入一个白球;
问:最后桶里面只剩下一个黑球的概率是多少?
//我写了一个简单的程序验证了一下,无论运行多少次都是只剩黑球,也就是只剩黑球的概率是100%
@Test
public void test02(){
// 1 代表白球 0 代表黑球 一共200 个 随机选取
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(1);
list.add(0);
}
while(true){
Random r = new Random();
// 依次随机取俩个球
int num = r.nextInt(list.size());
Integer integer = list.remove(num);
int num2 = r.nextInt(list.size());
Integer integer2 = list.remove(num2);
// 根据规则放球
if(integer.equals(1) && integer2.equals(1) || integer.equals(0) && integer2.equals(0)){
list.add(0);
}
if(integer.equals(0) && integer2.equals(1) || integer.equals(1) && integer2.equals(0)){
list.add(1);
}
if(list.size() == 1){
// 输出最后剩下什么球
System.out.println(list);
break;
}
}
}
代码的结果比较直观,但是还是可以通过叙述的方式叙述出来.
把黑球做0,白球看作1,每次的规则可以看作异或操作,即有相同的就放黑球,不同放白球.下表就是异或的四种情况,刚好符合我们的题目.
a | b | a ^ b |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
异或运算符合交换律,就是相同数量的0,1无论你怎么打乱顺序进行运算都不会影响结果,所以对于100颗白球和100颗黑球,可以等价于优先与将和100个黑球(0)做异或运算,再去和100个白球做异或运算的结果做异或运算.其实我也想了也可以这样理解100 * ( 0 ^ 1) 和上面那个的一样,最后都是剩余 100个黑球,要是使用异或的操作的话,我那个判断可以简化一下
if((integer ^ integer2) == 0 ){
list.add(0);
}
if((integer ^ integer2) == 1 ){
list.add(1);
}
也可以得出结论,偶数个1或者0进行异或运算最后都得到 0,最后贴出原博文博主总结的规律
a.偶数个0做异或运算的结果为0 b.奇数个0做异或运算的结果为0 c.偶数个1做异或运算的结果为0 d.奇数个1做异或运算的结果为1
参考博文博主列出了俩种思路,我只写了异或,感兴趣的小伙伴可以去下面这个地址去看看