如何创建具有随机产生的,非重复数二维数组? [重复]

问题描述 投票:0回答:2

这个问题已经在这里有一个答案:

我试图在目前阶段,生成的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?

java multidimensional-array
2个回答
0
投票

没有理由先存储在Set的数字;您可以生成随机数,直接到你的二维数组。此外,你被16而不是15相乘,所以你得到的数字为1-16代替1-15的。

既然你需要的号码是唯一的,你可以存储已经生成的号码列表,检查列表中的每个迭代。此外,你的二维数组有16个插槽,但只能满足15个号码,所以你需要知道这一点。

如果你想空插槽是随机的,你可以简单地选择范围从1到16的随机数,并跳过不是跳过16而不是break你虽然用continue的,因为我们没有做填充二维数组如果空插槽是不是最后一个。

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

0
投票

我会使用:1和15之间ThreadLocalRandom.current().nextInt(1, 16)这将返回一个(伪)随机整数生成号码

© www.soinside.com 2019 - 2024. All rights reserved.