这是我设计的一个随机抽取的方法,要求抽取的数字不能重复

遍历后还是固定有两个数字重复

img


第一个for循环是随机抽取
第二个for循环是选取当前抽取的前面的数组值
第三个while循环是判断是否与前面数组值相同,若相同则重新抽取至不重复跳出

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;
    }
}


img