随机不重复数组

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

思路1:

若某个位置数字相同 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]);
        }
    }
posted @ 2023-07-31 23:18  九落  阅读(54)  评论(0)    收藏  举报