JavaSE数组小题目:创建一个长度为6的int型数组,要求取值为1-30,同时元素值各不相同

创建一个长度为6的int型数组,要求取值为1-30,同时元素值各不相同

先是答案中的代码:

//创建初始化数组        
        int[] arr = new int[6];
//数组元素依次赋值        
        for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)        
            arr[i] = (int) (Math.random() * 30) + 1;
//判断,保证数组元素各不相等,当i=0时不满足判断条件,即arr[0]赋值无需去重
//此操作可以保证数组已经赋的值各不相同,只需判断当次赋值是否合格            
//利用j,从下标为0遍历至当前的i-1位置,
//         若出现重复,i自减1,即当次arr[i]赋值不合格,重新为此arr[i]赋随机值

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

这段代码是我自己的:

//1.创建长度为6的数组
        int[] arr = new int[6];
//2.首个元素一定不重复,给首个元素赋值
        arr[0] = (int)(Math.random()*30)+1;    
//3.数组赋值,构造循环结构,不断生成随机数 num  
//  num若不和arr[0]到arr[i-1]中任意一个相同,则满足条件,赋给arr[i]        
        for(int i=1 ; i<arr.length ; i++){
                                
            
                label: while(true){                
                        int num = (int)(Math.random()*30)+1;    
                    
                        for(int j=0;j<i;j++){    
                        
                                if(arr[j] != num)    //执行一轮以后,若一直不相等,说明num合格
                                    continue;
                                else
                                    continue label;
                        }
                
                        arr[i] = num;                                
                }
                    
        }
        
//4.遍历数组元素并输出    
        for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
        }

1.我自己的结构是 label 加在while前,
代码运行时无输出结果,逻辑上感觉没有问题,但是 for 中 i++ 提示为dead code,程序陷入死循环
2.尝试将 label 加在外层for循环前,
①代码可以正常运行,每次生成的6个数组元素各不相同,但生成的数组元素会出现 0,这是为什么?
②这种结构不符合逻辑,每次遇到生成的随机 num ,如果和数组中 arr[0] 到 arr[i-1] 中任意一个相同,
就要执行外层for,从arr[0]开始重新给数组元素赋值再判断

我想问下,1.为什么用我的这种带标签的continue编写程序会使外层的i++成为dead code?
2.为什么生成的数中会有0?是未给数组元素赋值导致的默认初始值?为什么会没有赋值成功呢?

while(true)
循环内没有break怎么结束循环?

img

public class Main {
    public static void main(String[] args) {
        //1.创建长度为6的数组
        int[] arr = new int[6];
        //2.首个元素一定不重复,给首个元素赋值
        arr[0] = (int)(Math.random()*30)+1;
        //3.数组赋值,构造循环结构,不断生成随机数 num
        //  num若不和arr[0]到arr[i-1]中任意一个相同,则满足条件,赋给arr[i]
        for(int i=1 ; i<arr.length ; i++){
            label: while(true){
                int num = (int)(Math.random()*30)+1;
                for(int j=0;j<i;j++){
                    if(arr[j] != num)    //执行一轮以后,若一直不相等,说明num合格
                        continue;
                    else
                        break label;
                }
                arr[i] = num;
            }
        }
        //4.遍历数组元素并输出
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}
package com.huaxin.exer;

public class ArrayExer3 {
    public static void main(String[] args){
        
        int[] arr = new int[6];
        boolean flag = false;
        for(int i = 0; i < arr.length; i++){
            arr[i] = (int)(Math.random() * 30) + 1;
            
            while(true){
                for(int j = 0; j < i; j++){
                    if(arr[i] == arr[j]){
                        flag = true;
                        break;
                    }
                }
                if(flag == true){
                    arr[i] = (int)(Math.random() * 30) + 1;
                    flag = false;
                    continue;
                }
                break;
            }
        }
        
        for(int i = 0; i < arr.length; i++){
            System.out.println(arr[i]);
        }
    }
}