随机不重复数组

九落 / 2023-08-01 / 原文

创建一个长度为 6 的 int 型数组,要求数组元素的值都在 1-30 之间,且是随机赋值。同时,要求元素的值各不相同。

	/**
     * 各个位置数字不同
     * 一直随机即可
     * 思路:
     * 若某个位置数字相同 eg: 位置1 和位置2数字相同
     * arr[1] = arr[2] 需重新随机数字 但重新随机后 数字可能还是相同 还是需要重新随机还一直嵌套判断吗?
     * 解:
     * 将重随的逻辑放到判断之外,可以使用标志位,
     * 又因为随机次数不确定,需要使用死循环
     */
    @Test
    public void test1() {
        int[] arr = new int[6];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int)(Math.random() * 30) + 1;
            //设置标志位的目的是将判断数字相同与重随两步从嵌套到分开
            boolean flag = false;

            //因为比较,重随次数不确定,所以要死循环
            while (true){

                for (int j = 0; j < i; j++) {
                    if (arr[i] == arr[j]){
                        //若为ture,则需要重随
                        flag = true;
                        break;
                    }
                }
                if (flag) {
                 //重随最后一个位置i,置为false,并跳出当前循环,因为为死循环,所以会继续判断重随的数是否还是重复
                    arr[i] = (int)(Math.random() * 30) + 1;
                    flag = false;
                    continue;
                }
                break;
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ",");
        }
    }

思路2:退到上一个位置

    @Test
    public void  test2(){
        int[] arr = new int[6];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int)(Math.random() * 30) + 1;
            for (int j = 0; j < i; j++) {
                if (arr[i] == arr[j]) {
                    i--;
                    break;
                }
            }
        }

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }