如果数组大小设置为小于数字值可以采用的值范围,请告诉我为什么这个随机数组生成器方法有效,但是不起作用。例如,方法适用于n = 10
和max = 100
。但如果n = 10
和max = 5
,则不会返回任何内容。
此外,有人可以解释为什么boolean
markDup
变量在这里使用?
提前感谢您的见解。
public static int[] getRandomArray(int n, int max) {
Random random = new Random();
int[] randomArray = new int[n];
for (int j = 0; j < n;) {
int randomNumber = random.nextInt(max - 1);
boolean markDup = false;
for (int indexRandomArray = 0; indexRandomArray < n; indexRandomArray++) {
if (randomArray[indexRandomArray] == randomNumber) {
markDup = true;
break;
}
}
if (!markDup) {
randomArray[j] = randomNumber;
j++;
}
}
for(int x:randomArray) System.out.print(x+" ");
System.out.println();
return randomArray;
}
答案 0 :(得分:3)
如果n
为10
且max
为5
,那么您将最终获得无限循环。
制作&#39;随机&#39;数字0,1,2和3每个随后生成的数字将被标记为重复。
当markDup
始终为true
时,永远不会执行j++
。
答案 1 :(得分:2)
很明显,您正在检查此行if (!markDup) {
中的数字是否重复,当然,当您设置的max小于数组大小时,将永远不会填满整个数组,因为这些数字不够并且永远不会增加j
,因此循环将无限期地运行
答案 2 :(得分:0)
这是一个固定版本(不会在生产中运行,随机性非常弱)
public class Test {
public static int[] getRandomArray(int n, int max, boolean allowDups) {
if (!allowDups && n > max) {
throw new IllegalArgumentException();
}
Random random = new Random();
int[] randomArray = new int[n];
outer: for (int j = 0; j < n;) {
int randomNumber = random.nextInt(max - 1);
if (!allowDups) {
for (int indexRandomArray = 0; indexRandomArray < j; indexRandomArray++) {
if (randomArray[indexRandomArray] == randomNumber) {
continue outer;
}
}
}
randomArray[j] = randomNumber;
j++;
}
for (int x : randomArray)
System.out.print(x + " ");
System.out.println();
return randomArray;
}
public static void main(String[] args) {
getRandomArray(10, 5, true);
getRandomArray(9, 10, false);
getRandomArray(10, 100, false);
getRandomArray(5, 1000, false);
}
}