JAVA 一个桶里面有白球. 黑球各 100 个

问题描述

一个桶里面有白球. 黑球各 100 个,现在按下述的规则取球:
i . 每次从桶里面拿出来两个球;
ii. 如果取出的是两个同色的球,就再放入一个黑球;
iii. 如果取出的是两个异色的球,就再放入一个白球;
问:最后桶里面只剩下一个黑球的概率是多少?

答案

1.每次操作都会减少一球,所以最后剩下黑球或者白球
2.由于白球每次操作要么不变,要么成对减少,所以最后不可能剩余一个白球,那么必然是剩余黑球了

代码

public class Test {

    /**
     * 运算逻辑:
     *  1.将前100个数指定为白球,后100个指定为黑球,放入set里,然后再统一放入all set里
     *  2.随机取两个,执行取球放球的逻辑
     *  3.将剩余的黑白球重新排序,再循环继续之前的取球操作
     *  4.黑球或者白球有一个取尽的时候结束运行
     * @param args
     */
    public static void main(String[] args) {
        //白球 0~99
        Set<Integer> white = new HashSet<>();
        for(int i=0;i<100;i++){
            white.add(i);
        }
        //黑球 100~199
        Set<Integer> black = new HashSet<>();
        for(int j=100;j<200;j++){
            black.add(j);
        }
        //所有的球 0~199
        Set<Integer> all = new HashSet<>();
        all.addAll(white);
        all.addAll(black);

        Random random = new Random();
        //新增的黑球(大于199就行,防止set插入值重复)
        int blackCount = 200;
        //遍历次数
        int count = 1;
        //黑白球比较数
        int compareNum = 100;
        while (true){
            int first = random.nextInt(all.size());
            int second = random.nextInt(all.size());
            if(first == second) continue;
            //都是白球
            if(first<compareNum && second<compareNum){
                white.remove(first);
                white.remove(second);
                all.remove(first);
                all.remove(second);
                black.add(blackCount);
                all.add(blackCount);
            }
            //都是黑球
            if(first>=compareNum && second>=compareNum){
                all.remove(second);
                black.remove(second);
            }
            //一白一黑
            if((first<compareNum && second>=compareNum)){
                all.remove(second);
                black.remove(second);
            }
            //一黑一白
            if((first>=compareNum && second<compareNum)){
                all.remove(first);
                black.remove(first);
            }
			//黑球或者白球取尽时跳出循环
            if(black.size()==0 || white.size()==0){
                break;
            }

            //set重排
            Set<Integer> newWhite = new HashSet<>();
            for(int ii=0;ii<white.size();ii++){
                newWhite.add(ii);
            }
            white = newWhite;
            Set<Integer> newBlack = new HashSet<>();
            for(int jj=0;jj<black.size();jj++){
                newBlack.add(white.size() + jj);
            }
            black = newBlack;
            compareNum = white.size();
            all.clear();
            all.addAll(white);
            all.addAll(black);
            System.out.println("第"+count+"次,白球剩余"+white.size()+"个,黑球剩余"+black.size()+"个。");
            count++;
        }
        System.out.println("第"+count+"次,白球剩余"+white.size()+"个,黑球剩余"+black.size()+"个。");
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值