问题描述
编写一个程序来生成 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);