问题:随机生成100个,任何单值重复不超过两次,取值1~50之间的整数
知识点:循环结构,选择结构
思路:思路其实不复杂,设置三个数组,一个用来接收随机数,一个用来接收随机数数组里不重复的数值,一个用来计数上一个不重复数组里对应元素的出现次数。判断一个数和之前的数是否重复,只需要去检索一下不重复数组里是否存在,如果不存在,赋值给不重复数组的下一个元素;如果重复,则找到对应的索引,计数数组对应的数值+1。代码如下:
Random rand = new Random();
final int N=100;
int[]arr = new int[N];
int[]uqarr = new int[N];//定义一个不重复数组
int[]uqcnt = new int[N];//定义一个和上面数组对应的,上面每个元素对应的计数
int ix = 0;//新的下标,用于自加
for (int i = 0; i <arr.length ; ) {//for循环里不加循环条件,上面设置了备用的下标
int t = rand.nextInt(50)+1;//生成一个随机数
int tx=-1;//设置一个判断数字,初始值为-1,若满足执行条件,赋予新值
for (int j = 0; j <ix ; j++) {//新的循环体,遍历不重复数组的已有值,找出和t重复的值
if (t==uqarr[j]){
tx = j;//如果找到重复值,把与不重复数组重复的值的下标赋值给tx
break;//跳出for循环,执行下面语句
}
}
if (tx!=-1&&uqcnt[tx]>=2)continue;//如果上面找到重复值了并且重复次数大于等于2,后面不执行;
//如果没有重复或者重复值的次数不大于2,执行以下语句(分成两种情况,没有重复的话不重复数组要赋值,计数数组值由0变成1;有重复的话,对应的计数数组++)
arr[i++]=t;//arr赋上新值
if (tx==-1){//如果没有重复的话,执行以下语句(赋值给不重复数组,计数数组元素的值++,索引++)
uqarr[ix]=t;
uqcnt[ix++]++;
}else uqcnt[tx]++;//如果有重复,计数数组对应索引的值++
}