二维数组随机索引乐透游戏

2D array random index Lotto game

我正在尝试做一个乐透游戏,我必须生成一张随机卡,第一列数字从 1-9,第二列 10-19 一直到 90。卡的另一个规则是它在每一行的随机位置只能有 5 个数字,这就是我遇到的问题。

我开始用这个在每一列中放置数字:

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);
}

然后将 5 个数字放在数组每一行的数字位置我试过这个:

//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++;
    }
}

第三个也一样

输出:

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 |

问题是有时我得到 5 个数字,有时是 6 个,有时是 4 个,有时我在每行中得到完美的 5 个数字。更令人沮丧的是,不工作只是有时工作...

我想,我认为这是因为随机数有时会重复自己,所以它们会转到相同的索引,但有时我有超过 5 个数字,所以这没有意义。

预期的正确输出:

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 | 

这是与之前几乎相同的代码。卡片变成了行。

public static void lottery() {
    System.out.println("  1  2  3  4  5  6  7  8  9");
    System.out.println("---------------------------");

    for (int card = 1; card<= 5; card++) {
        List<Integer> numbers = new ArrayList<>();
        for (int i = 0; i <= 8; i++) {
            int s = i > 0 ? 0 : 1;  
            numbers.add(ThreadLocalRandom.current().nextInt(i*10 + s,(i+1)*10));
        }
        Collections.shuffle(numbers);
        int[] row = new int[9];
        for (int s = 0; s < 5; s++) {
            int pick = numbers.get(s);
            row[pick/10] = pick; 
        }
        for (int i = 0; i < 9; i++) {
            System.out.printf("%3d", row[i]);
        }
        System.out.println();
    }
}

版画

  1  2  3  4  5  6  7  8  9
---------------------------
  5  0  0  0 47  0 67 71 81
  1  0 22  0  0 55 65  0 88
  1 11  0 30  0 58  0 76  0
  0 10 24  0 43  0  0 75 88
  3 16  0  0  0  0 60 71 81

我认为您的方法比应有的复杂。我建议像下面那样做:

对于二维数组的每一行,生成一个介于 [1 - 90) 之间的随机数,然后将随机数除以 10 将其放到它所属的位置(将为你提供值 [0 - 8] ) 同时检查该位置是否没有分配随机值。重复 5 次。

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));
    }
}

示例输出:

[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]

你可以这样做:

  • 卡片由 3 行组成。
  • 每行由 9 个随机单元格组成:5 个填充单元格和 4 个空心单元格。
  • 列范围:1-9 第一,80-90 最后,x0-x9 其他。
  • 每一列都没有重复的数字。
List<int[]> card = new ArrayList<>();
IntStream.range(0, 3)
        // prepare a list of cell indices of the row
        .mapToObj(row -> IntStream.range(0, 9)
                .boxed().collect(Collectors.toList()))
        // random order of cell indices
        .peek(Collections::shuffle)
        // list of 5 random cell indices in the row
        .map(list -> list.subList(0, 5))
        // fill the cells with random numbers
        .map(list -> IntStream.range(0, 9)
                // if this cell is in the list, then fill
                // it with a random number, otherwise 0
                .map(i -> {
                    int number = 0;
                    if (list.contains(i)) {
                        // unique numbers in each column
                        boolean isPresent;
                        do {
                            // [1-9] first, [80-90] last, [x0-x9] others
                            number = (int) ((i > 0 ? i * 10 : 1)
                                    + Math.random()
                                    * (i < 8 ? (i > 0 ? 10 : 9) : 11));
                            isPresent = false;
                            for (int[] row : card)
                                if (row[i] == number)
                                    isPresent = true;
                        } while (isPresent);
                    }
                    return number;
                }).toArray())
        // add this row to the card
        .forEach(card::add);
// output
card.stream()
        // row of numbers to string
        .map(row -> Arrays.stream(row)
                .mapToObj(j -> j == 0 ? "  " : String.format("%2d", j))
                // concatenate cells into one row
                .collect(Collectors.joining(" | ", "| ", " |")))
        .forEach(System.out::println);

输出:

|  7 | 20 |    |    | 47 | 53 |    |    | 86 |
|    |    | 27 | 38 |    |    | 63 | 80 | 85 |
|  4 |    | 26 |    |    |    | 69 | 77 | 81 |