当用户在 Java 中输入数组的大小时,如何生成从 0 到 100 的随机数而不会重复?

问题描述

编写一个程序来生成 0 到 100 之间任意数量随机整数 范围。您的程序应该获取大小作为参数并返回 数字作为数组。

这是我得到的问题,下面是我尝试过的代码,但我得到了与此代码重复的代码。如何生成不重复的随机数?

    import java.util.Arrays;
    import java.util.Random;
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(system.in);
            
            System.out.println("size:\t");
            int n = sc.nextInt();
    
            int[] arr = new int[n];
    
            Random rand = new Random(); //instance of a random class.
            int upperbound = 101; //generate random values from 0-100
    
            for(int i=0;i<n;i++) {
                arr[i] = rand.nextInt(upperbound);
            }
            System.out.println("Random Numbers: "+ Arrays.toString(arr));
            
        }
    }
     

解决方法

您可以创建一个包含从 0 到 100 的所有值的列表,然后将其打乱并提取该列表的前 n 个元素,如下所示:

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("size:\t");
        int n = sc.nextInt();

        int bound = 100;
        
        List<Integer> items = IntStream.range(0,bound + 1)
                .boxed()
                .collect(Collectors.toList());

        Collections.shuffle(items);

        int[] arr = new int[Math.min(n,bound + 1)];
        for(int i = 0; i < arr.length; i++){
            arr[i] = items.get(i);
        }

        System.out.println("Random Numbers: "+ Arrays.toString(arr));
    }
,

您可以使用 HashSet 并继续向其中添加所有新条目,并在生成新的 random 整数时,检查它是否已经生成(如果该数字存在于 {{1 }} 设置)。
如果号码已经生成,则继续生成新号码,直到找到唯一号码。

unique
,

您可以创建一个 1...100 的列表(我们称之为“l”),以及一个大小为 100 的数组(我们称之为“a”)。

然后,创建一个 for 循环并生成一个介于 0 到 l.size() - 1 之间的数字。

第一次迭代生成(我们称之为 index0)将是 l 中的索引,它将被视为数组中的第一个对象。所以调用l.remove(index0),并在a[0]中使用检索到的对象。

第二次迭代生成,在0到l.size()-1之间,即0到98,即index1。调用 l.remove(index1),检索到的对象将用于 a[1] 中的第二个索引。

这样做直到 l 为空。

,

此代码也能运行

public void solution(int size){


    int upperbound = 101;
    int arr[]=new int[upperbound];

    /**
     * initial a number arr store 0-100
     */
    for (int i = 0; i <upperbound ; i++) {
        arr[i]=i;
    }

    SecureRandom secureRandom=new SecureRandom();
    for (int i = 0; i <size ; i++) {

        /**
         * if generate a index,print number and swap now index number and tail
         */
        int index=secureRandom.nextInt(upperbound-i);
        int tmp=arr[index];
        int last=arr[arr.length-1-i];

        System.out.println(tmp);
        arr[index]=last;
    }

}
,

您可以使用 ArrayList 代替使用 Array,并仅在之前未使用过的情况下将值添加到 ArrayList。

ArrayList<Integer> numbers = new ArrayList<Integer>();
    Random random = new Random();
if (!numbers.contains(randomNumber)) {
    numbers.add(randomNumber);
}

之后你可以直接打印ArrayList或将其转换为数组然后打印出来。

Integer[] arr = new Integer[number.size()];
    // ArrayList to Array Conversion
    for (int i = 0; i < number.size(); i++) {
        arr[i] = number.get(i);