随机数组生成器中的错误

时间:2015-10-05 17:50:30

标签: java arrays random generator

如果数组大小设置为小于数字值可以采用的值范围,请告诉我为什么这个随机数组生成器方法有效,但是不起作用。例如,方法适用于n = 10max = 100。但如果n = 10max = 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;
    }

3 个答案:

答案 0 :(得分:3)

如果n10max5,那么您将最终获得无限循环。

制作&#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);
    }
}