随机生成的唯一编号

时间:2016-09-10 15:39:55

标签: java arrays

我正在编写一个用于生成4096个随机和唯一整数的1d和2d数组的程序。我坚持我的方法来确定是否已经使用了一个整数,如果有,则抛出它并得到一个新的整数。目前,我收到一个越界异常错误,我已经查找了如何删除oob,但我没有找到任何与我的程序有关的帮助。有人可以看看我的代码,让我知道需要改变什么才能使逻辑正常工作?谢谢!

2D数组:

Random random = new Random();

int[][] arrayone = new int[4097][1];
boolean[][] used = new boolean[4097][1];

for(int b = 0; b < arrayone.length; b++) {
    for(int i = 0; i < arrayone[b].length; i++) {
        for (int number = 0; number < used.length; number++) {
            for (int x = 0; number <used[number].length; x++) {

                number = random.nextInt(99999)+1;

                if (!used[number][x]){
                    used[number][x] = true;
                    arrayone[b][i] = number;
                }
                else {
                    while(used[number][x]) {
                        number = (int)(Math.random() * 99999 + 1);
                        if (!used[number][x]) {
                            used[number][x] = true;
                            arrayone[b][i]=number;
                            break;
                        }
                    }
                }
            }
        }
    }
}

1D数组:

int[] arrayone = new int[4097];
boolean[] used = new boolean[4097];

for(int i = 0; i < arrayone.length; i++) {
    int number = (int)(Math.random() * 99999 + 1);

    if (!used[number]){
        used[number] = true;
        arrayone[i] = number;
    }
    else {
        while(used[number]) {
            number = (int)(Math.random() * 99999 + 1);
            if (!used[number]) {
                used[number] = true;
                arrayone[i]=number;
                break;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

最好的方法是使用Set<Integer>存储您已生成的数字,以便轻松了解它们是否已经添加/生成,如下所示:

Random random = new Random();
int[][] arrayone = new int[4097][1];
// Create my set of already generated numbers
Set<Integer> existingNumbers = new HashSet<>();
for(int b = 0; b < arrayone.length; b++) {
    for(int i = 0; i < arrayone[b].length; i++) {
        // Loop as long as the generated number cannot be added into the Set
        // indicating that it has already been added so already been generated
        int number;
        do {
            number = random.nextInt(99999) + 1;
        } while (!existingNumbers.add(number));
        // Add the number in my array
        arrayone[b][i] = number;
    }
}

答案 1 :(得分:0)

因为您宣布:

boolean[] used = new boolean[4097];

但是试图访问:

int number = (int)(Math.random() * 99999 + 1);
if (!used[number])

这里number可能大于4096.这就是你越界失误的原因。 2D阵列也是如此。

要解决此问题,请在声明时增加数组大小。