获取1-33之间的随机数,并且返还数组类型。这里的循环结果还是会出现重复的数字或者0,应该怎么改

package code;

import java.util.Random;

public class Code2 {
    public static void main (String[] args) {
        Random r = new Random();
        int[] s = new int[6];
        for (int i = 0; i < 6; i++) {
            
            int red = r.nextInt(33);
            //循环条件 遍历数组判断随机数是否在数组中
            for (int j = 0; j < s.length; j++) {
                if(s[j] == red || red == 0) {
                    continue;
                } else {
                    s[i] = red;
                }
            }
        }
        
        for (int i : s) {    
            System.out.println(i);
        }
    }
}
 

int red = r.nextInt(33) + 1;

int nextInt(int num)         //随机返回一个值在[0,num)的int类型的整数,包括0不包括num

public static int[] randomCommon(int min, int max, int n){  
    if (n > (max - min + 1) || max < min) {  
           return null;  
       }  
    int[] result = new int[n];  
    int count = 0;  
    while(count < n) {  
        int num = (int) (Math.random() * (max - min)) + min;  
        boolean flag = true;  
        for (int j = 0; j < n; j++) {  
            if(num == result[j]){  
                flag = false;  
                break;  
            }  
        }  
        if(flag){  
            result[count] = num;  
            count++;  
        }  
    }  
    return result;  
}  

 

你的代码需求是什么?代码期望返回的结果是什么?

nextint(33)是产生0-33的随机数,所以会有零,可以用nextint(32)+1产生1-33

代码如下

 

import java.util.Random;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


class Playground {
    public static void main(String[ ] args) {
        List<Integer> list1 = new ArrayList<Integer>();
        while(true){
            if(list1.size()==6) break;
            Random r = new Random();
            Integer num = new Integer(r.nextInt(32)+1);
            if(!list1.contains(num)) list1.add(num);
            
        }
        System.out.println(list1);
        
    }
}

 

1.把获得的随机数,放到set集合中,因为set集合是不可重复的

2.判断set集合中的元素,当元素个数达到要求后,停止放数字

3.把set集合转成数组

如果只想用数组

1.产生随机数,判断是否在数组中,如果在就跳过这次,如果不在就放入

2.重点在跳过上,continue

您好,我是问答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题。

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

测了你的代码,有两个需要注意的地方。

    1、int[] s 在初始话的时候就是有值的,默认是 0。在你的red为0或者已存在时,会轮空, s[i] 会获得初始值 0(这个应该就是你一直会有 0 的原因)

    2、你的内部for循环应该是为了判断,red的值知否已存在。那么就不应该在内部循环中有 s[i] = red 的赋值,应该是在内部循环标记一个是否已存在:如果不存在,在外层赋值;如果存在,则要重新走一遍逻辑,只到第 i 位赋值成功。

    3、这段代码可能有问题,如果你返回的数组长度靠近取值范围。例如:求 0-32之前一共32个整数随机值,如果结果 s 数组长度是30,你的red很容易重复,会循环很多次。如果 s 长度超过 32 则会死循环。

    写了个例子,参考下:

package com.jcfintech.esign.business.common;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;


public class Test {
    public static void main(String[] args) {
        List<Integer> valueList = getIntValueArr(32);
        int[] s = getNoRepeatIntArr(valueList, 6);

        for(int i: s){
            System.out.print(i + ",");
        }
    }

    private static List<Integer> getIntValueArr(int maxIntValue){
        List<Integer> valueList = new ArrayList<>();
        for(int i = 1; i <= maxIntValue; i++){
            valueList.add(i);
        }
        return valueList;
    }

    private static int[] getNoRepeatIntArr(List<Integer> valueList, int length){
        int valueListLength = valueList.size();

        if(length > valueListLength) System.out.println("结果数组长度超过取值范围");

        Random random = new Random();
        int[] s = new int[length];
        for(int i = 0 ; i <length; i++){
            int index = random.nextInt(valueListLength);
            s[i] = valueList.get(index);
            valueList.remove(index);

            valueListLength --;
        }
    return s;
    }
}