黑白球问题

题目:有一个桶,里面有白球、黑球各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

参考博文博主列出了俩种思路,我只写了异或,感兴趣的小伙伴可以去下面这个地址去看看

参考博文: 概率题之黑白球问题_胡小白的数据科学之路的博客-CSDN博客

您可以使用 OpenCV 中的颜色空间转换和阈值化技术来识别黑白。首先,将摄像头捕获的图像转换为灰度图像,然后使用阈值化技术将图像二值化。接下来,使用形态学操作来消除噪声并找到的轮廓。最后,使用轮廓特征来确定的位置和大小。以下是示例代码: ```python import cv2 # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取摄像头捕获的图像 ret, frame = cap.read() # 将图像转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 对灰度图像进行阈值化 ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 进行形态学操作 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) # 查找轮廓 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历轮廓 for cnt in contours: # 计算轮廓的面积 area = cv2.contourArea(cnt) # 如果面积太小,则忽略该轮廓 if area < 100: continue # 计算轮廓的外接圆 (x, y), radius = cv2.minEnclosingCircle(cnt) # 绘制外接圆 cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 0), 2) # 显示图像 cv2.imshow('frame', frame) # 按下 q 键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头并关闭窗口 cap.release() cv2.destroyAllWindows() ``` 请注意,此代码仅适用于黑白。如果您需要识别其他颜色的,您需要更改阈值化和形态学操作的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值