问题描述
一个桶里面有白球. 黑球各 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()+"个。");
}
}