遍历后还是固定有两个数字重复
1、nextInt里面改为arr.length,因为取随机数nextInt(arr.length-1),区间最大值为arr.length-2,所以需要改为arr.length,即可保证区间最大到arr.length-1。
2、然后再把判断相同的for循环外面再加一个while循环,即循环比较多次,直到取到与前面元素全部不同的值,因为如果只循环遍历一次,当前下标i的元素值只需和最后一个j下标的元素值不同就可以了。
测试代码如下:
参考链接:
import java.util.Random;
public class RandomNumTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int result[] = ra(arr);
// for(int i=0;i<result.length;i++) {
// System.out.print(result[i]+" ");
// }
}
public static int[] ra(int[] arr) {
Random r = new Random();
int [] temp = new int[arr.length];
int i,j;
// https://blog.csdn.net/weixin_41213648/article/details/95340511
for(i=0;i<arr.length;i++) {
temp[i]=arr[r.nextInt(arr.length)]; //随机从数组取一个数
int same; // 重复标志,用于标记下标i的值与前面的元素是否有相同,1为有相同,0为都不同
while(true) { // 循环判断
same=0; // 比较之前,重复标志置0,表示都不同
// 遍历i之前的每个元素
for( j=0;j<i;j++) {
//System.out.println("before , temp[i]==temp[j],"+"temp["+i+"]="+temp[i]+",temp["+j+"]="+temp[j]);
//如果相同,则 重复标志置1,退出当前的for循环
if(temp[i]==temp[j]) {
same=1;
break;
}
//System.out.println("after,"+"temp["+i+"]="+temp[i]+",temp["+j+"]="+temp[j]);
}
// 如果和前面的元素比较完都不同,则退出while循环
if(same==0) {
break;
}
// 如果相同,则再从数组随机取一个元素
temp[i]=arr[r.nextInt(arr.length)];
}
//System.out.println("end second for ,"+"temp["+i+"]="+temp[i]);
// 打印每次取出的这个不同元素
System.out.print(temp[i]+" ");
}
return temp;
}
}
我们还可以使用链表来实现,加减也是和上面的方法一样