在做一道题的时候遇见的问题:双色球的六位红球数字不能重复,且数字随机(1-33)
这个问题就涉及了查重问题,我刚开始的解决方案是这样的,很麻烦:
while(true) {
flagDouble = 0;
for(int j = 0;j < 6;j++) {
if(doubleColor[i]==doubleColor[j]) {
flagDouble++;
}
}
if(flagDouble>1) {
doubleColor[i] = (int)(33*Math.random()+1);
flagDouble=0;
}else {
break;
}
}
这样的方法代码量多,看着很乱,还需要多余的与自身的对比。
后来尝试了布尔数组,方法如下:
for(int i = 0;i < 6;i++){
do{
num = (int)(33*Math.random()+1);//如果产生相同的数,那么继续循环
}while(bool[num]);
bool[num] = true;//产生了一个没有重复的数字之后,就将对应的布尔数组下标的值变为true
num[i] = num + 1;
}
每产生一个不重复的数值,就将对应的布尔数字下标相同的值变为true,这样就不需要进行循环对比,减少代码的复杂度。
还可以用这种方式:
for (int i = 0; i < 6; i++) {
int randomNum = random.nextInt(33) + 1;
if (balls[randomNum]){
i--;
}else{
balls[randomNum] = true;
redBalls[i] = randomNum;
}
}
两种差别就是一个采用了do/while循环,一个没有用,效果是一样的