Java:如何随机初始化用户定义大小的2D数组的顺序?

Java:如何随机初始化用户定义大小的2D数组的顺序?,java,multidimensional-array,Java,Multidimensional Array,我正在开发一个程序,其中用户选择一个正方形NxN数组的大小,其中N是他们选择的数字,代表行和列的数量 我的程序背景是制作一个N字谜游戏。因此,无论用户选择什么大小,通过数组空间数-1,值都将是0。例如,如果用户选择3作为大小,这将是一个3x3数组,这意味着数字将有9个空格,数字将是0-8 这是我目前的代码: public static void main(String[] args) { Scanner scanner = new Scanner(System.in);

我正在开发一个程序,其中用户选择一个正方形NxN数组的大小,其中N是他们选择的数字,代表行和列的数量

我的程序背景是制作一个N字谜游戏。因此,无论用户选择什么大小,通过数组空间数-1,值都将是0。例如,如果用户选择3作为大小,这将是一个3x3数组,这意味着数字将有9个空格,数字将是0-8

这是我目前的代码:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);      
    System.out.print("Enter dimension n of an nxn puzzle:");      

    int n = Integer.parseInt(scanner.nextLine());

    int[][] puzzle = new int[n][n]; 
}
因此,基本上我必须弄清楚如何初始化它,使值以随机顺序排列,并且值必须与那些特定的数字(0-8或根据用户需要的任何情况)在一起


此外,我们不允许使用任何外部算法,如Fisher-Yates Shuffle算法

实际上数组的维数根本不重要

随机初始化的一种简单方法是:

  • 按照值的显示顺序初始化数组
  • 遍历所有元素,并将它们的值与数组中随机选择的元素的值交换

  • 这可能是您的方式,除非每个数字只允许出现一次:

    public int[][] initRandomArray(int n){
        int[][] puzzle = new int[n][n];
        Random random = new Random();
        for(int x = 0; x < puzzle.length; x++)
            for(int y = 0; y < puzzle.length; y++)
                puzzle[x][y] = random.nextInt(n * n);
        return puzzle;
    }
    
    public int[][]initRandomArray(int n){
    int[][]拼图=新的int[n][n];
    随机=新随机();
    对于(int x=0;x
    编辑: 我想我现在明白你的问题了。这将有助于您:

    public int[][] initRandomArray(int n){
        int[][] puzzle = new int[n][n];
    
        ArrayList<Integer> numbers = new ArrayList<Integer>();
        for(int i = 0; i < n * n; i++)
            numbers.add(i);
    
        Random random = new Random();
        for(int x = 0; x < puzzle.length; x++)
            for(int y = 0; y < puzzle.length; y++)
                puzzle[x][y] = numbers.remove(random.nextInt(numbers.size()));
        return puzzle;
    }
    
    public int[][]initRandomArray(int n){
    int[][]拼图=新的int[n][n];
    ArrayList编号=新的ArrayList();
    对于(int i=0;i
    您可以使用嵌套for循环在数组中进行迭代,在通过Java提供的随机类进行迭代时分配数组的每个值。如果数组中不能有重复的数字,则可能需要检查该数字是否已被使用

    Random rnd = new Random();
    
    //inside nested for loop
    while (value has already been picked){
        // gives a random value btwen 0 and (n*n)-1
        value = rnd.nextInt((n*n));
    }
    
    // value has not been used
    puzzle [i][j]= value;
    

    有很多方法可以检查是否使用了某个值(当我有这样一个项目时,我使用了一个布尔数组)

    我的意思是你的数组创建得很好,现在创建一个循环来随机填充它?所以基本上当你说
    时,我们不允许使用任何外部算法,如Fisher-Yates Shuffle算法
    ,您必须编写自己的随机生成器,对吗?此解决方案仅在值为连续数字时有效。我不确定我们是否可以假设这一点,参见原始问题的最后第二段。此外,如果n变大,可能需要生成大量随机数,直到得到一个未使用的随机数。