Search code examples
javaarraysrandomarray-indexing

2D array random index Lotto game


I'm trying to do a Lotto game where I have to generate a random card and in the first column numbers go from 1-9, second 10-19 all the way to 90. Another rule of the card is that it can only have 5 numbers at random positions in each line and that's what I'm having trouble with.

I've started with this to put numbers in each column:

int[][] numberCard = new int[3][9];

for (int i = 0; i < numberCard.length; i++) {
    numberCard[i][0] = randInt(1, 9);
}

for (int j = 0; j < numberCard.length; j++) {
    numberCard[j][1] = randInt(10, 19);
}

And then do put 5 numbers in a number position in each line of the array i tried this:

//Five numbers first line
Random random0 = new Random();
int randomLocation = 0;

while (randomLocation < 5) {
    int z0 = random0.nextInt(numberCard.length);
    int b0 = random0.nextInt(numberCard[0].length);

    if (numberCard[z0][b0] > 0) {
        numberCard[z0][b0] = 0;
        randomLocation++;
    }
}

//Five numbers second line
Random random1 = new Random();
int randomLocation1 = 0;

while (randomLocation1 < 5) {
    int z1 = random1.nextInt(numberCard.length);
    int b1 = random1.nextInt(numberCard[1].length);

    if (numberCard[z1][b1] > 0) {
        numberCard[z1][b1] = 0;
        randomLocation1++;
    }
}

And then the same for the third one.

Output:

0 | 18 |  0 |  0 | 46 |  0 | 61 | 72 | 88 |
0 | 18 |  0 | 31 |  0 | 55 |  0 |  0 |  0 | 
0 |  0 | 23 | 34 | 45 |  0 |  0 |  0 | 80 |

The problem is that sometimes I get 5 numbers, sometimes 6 and sometimes 4 when sometimes i get the perfect 5 numbers in each line. More frustrating that not working is only working sometimes...

I thought and I think it is because of the random numbers that sometimes repeat themselves so they go to the same index, but then sometimes I have more than the 5 numbers so that makes no sense.

Correct output expected:

0 | 18 | 23 | 30 | 48 |  0 |  0 | 76 |  0 | 
0 | 12 | 24 |  0 |  0 | 58 | 61 | 78 |  0 | 
1 | 17 |  0 |  0 | 42 | 54 |  0 |  0 | 86 | 

Solution

  • I think your approach is complicated than it should be. I would recomend to do it like below:

    For each row of your 2D-Array, generate a random number between [1 - 90) and put it to the spot where it belongs by dividing the random number with 10 (will give you values [0 - 8]) while checking that that position doesn't have a random value aready assigned. Reapet this 5 times.

    public static void main(String[] args) {
        int[][] numberCard = new int[3][9];
    
        Random rand = new Random();
        for (int i = 0; i < numberCard.length; i++) {
            for (int j = 0; j < 5; j++) {
                int x = rand.nextInt(89) + 1;
                while (numberCard[i][x / 10] != 0) {
                    x = rand.nextInt(89) + 1;
                }
                numberCard[i][x / 10] = x;
            }
        }
    
        //print or do whatever with your numberCard array
    
        for (int[] row : numberCard) {
            System.out.println(Arrays.toString(row));
        }
    }
    

    Sample output:

    [0, 0, 24, 0, 40, 55, 0, 71, 86]
    [0, 16, 0, 0, 42, 56, 0, 70, 84]
    [5, 12, 0, 0, 49, 0, 69, 0, 82]