-1

I am writing a program for a 1d and 2d array that generates 4096 random and unique integers. I am stuck on my method for determining whether or not an integer has already been used, and if it has, to throw it and get a new integer. Currently, I am getting an out of bounds exception error, and I have looked up how to remove oob, but I haven't found anything helpful related to my program. Could someone take a look at my code and let me know what needs to be changed to get the logic working correctly? Thanks!

2D Array:

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 Array:

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;
            }
        }
    }
}
Nicolas Filotto
  • 43,537
  • 11
  • 94
  • 122
Millie
  • 73
  • 1
  • 2
  • 7
  • Instead of using 2 arrays to store the value and whether the number is used or not, try using [sets][1]. they are easy to insert data onto and check to see if they are already [there][2] as well [1]: https://examples.javacodegeeks.com/core-java/util/set/java-set-example/ [2]: http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html – Infamous Sep 10 '16 at 15:52

2 Answers2

3

The best way is to use a Set<Integer> to store your already generated numbers in order to easily know if they have already been added/generated or not as next:

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;
    }
}
Nicolas Filotto
  • 43,537
  • 11
  • 94
  • 122
0

Because you declared:

boolean[] used = new boolean[4097];

But trying to access:

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

Here the number may be greater than 4096. That's why you are getting out of bounds exception error. Same thing goes for 2D array.

To solve this, just increase the array size when declaring.

Shahid
  • 2,288
  • 1
  • 14
  • 24