如何用随机生成的非重复数字创建二维数组?

时间:2019-02-03 00:13:12

标签: java multidimensional-array

我正在尝试模拟15的游戏。目前在该阶段打印从1到15的2D随机生成的数字数组。这可能是一个输出示例,其中的空白空间可以是数组中的任何位置:

1   3   5   6
7   9   10  13
2   4   8   11
12  14  15

public class Game {
public static void main(String[] args) {
    Set<Integer> set = new HashSet<>();
    int gameboard[][] = new int[4][4];

    while(set.size() != 4*4){
        set.add((int)(1+Math.random() * 16));
    }

    List<Integer> list = new ArrayList<>(set);

    for (int row=0; row < gameboard.length; row++) {
        for (int col=0; col < gameboard[row].length; col++) {
            gameboard[row][col] = list.get(row*gameboard.length + col);
            System.out.printf("%-4d",gameboard[row][col]);
        }
        System.out.println();
        }
      }

}

但是,我当前的代码以这样的升序打印1-15:

1   2   3   4
5   6   7   8
9   10  11  12
13  14  15  16

我应该如何使数字在每次运行时都变得混乱且不同,并且有一个空元素(如上面的输出),所以数字范围是1-15?

2 个答案:

答案 0 :(得分:0)

没有理由先将数字存储在Set中;您可以直接向2D数组生成随机数。此外,您乘以16而不是15,所以得到的数字范围是1-16而不是1-15

由于您需要数字是唯一的,因此可以将已经生成的数字存储在列表中,并在每次迭代时检查列表。此外,您的2D数组有16个插槽,但是您只能容纳15个数字,因此您也需要注意这一点。

如果您希望空插槽是随机的,则只需选择一个1到16之间的随机数,然后跳过该数字即可,而不是跳过16。不过,您可以使用break代替continue,因为如果空插槽不是最后一个插槽,我们就无法填充2D数组。

int[][] gameboard = new int[4][4];
ArrayList<Integer> used = new ArrayList<Integer>();
int emptySlot = (int) (1 + Math.random() * 16);

for(int row = 0; row < gameboard.length; row++) {
    for(int col = 0; col < gameboard[row].length; col++) {
        if(row*gameboard.length + col == emptySlot) {
            System.out.print("    ");
            continue; //skip empty slot
        }
        int number;
        while(used.contains(number = (int) (1 + Math.random() * 15)));
        used.add(number);
        gameboard[row][col] = number;
        System.out.printf("%-4d",gameboard[row][col]);
      }
    System.out.println();
}

答案 1 :(得分:0)

我将使用:ThreadLocalRandom.current().nextInt(1, 16),它将返回一个介于1到15之间的(伪)随机整数来生成数字