【问题标题】:How to create a random matrix using arrays如何使用数组创建随机矩阵
【发布时间】:2016-12-01 15:18:48
【问题描述】:

我想使用数组和 Arrays.fill 方法创建一个随机的 5x5 矩阵。 这就是我所做的:

import java.util.*;

class RandomMatrix {
    public static void main (String  [] args) {

        int i,j;
        int [] [] matrix = new int [5] [5];
        Arrays.fill (matrix, (int) Math.random()*10);

        for (i=0; i<matrix.length; i++) {
            for (j=0; j<matrix[i].length; j++) {

                System.out.printf("%-5d", matrix [i][j]);
            }           
            System.out.println();
        }           
    }
}

我实际上认为它会这样工作,但现在我得到了这个错误:

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer
    at java.util.Arrays.fill(Unknown Source)
    at RandomMatrix.main(RandomMatrix.java:8)

【问题讨论】:

  • 您是否意识到您不是在创建一个包含 25 个随机选择的元素的 5x5 矩阵,而是一个所有元素都相等(但随机选择)的 5x5 矩阵?
  • 二维数组是数组的数组。所以你必须用int[]s 填充matrixint[] 的数组),而不是ints。因此ArrayStoreException.
  • Math.random() > 返回一个带正号的双精度值,大于等于 0.0 小于 1.0。 if is 0

标签: java arrays matrix


【解决方案1】:

使用与打印矩阵相同的循环结构。

for (int i=0; i<matrix.length; i++) {
    for (int j=0; j<matrix[i].length; j++) {
        matrix[i][j] = (int) (Math.random()*10);
    }           
}

Arrays.fill() 适用于数组,您的矩阵是由数组组成的数组。即使你使用了Arrays.fill (matrix[0], (int) Math.random()*10); 之类的东西,你也会将相同的(随机选择的)值放入第 0 行的每个单元格中。

【讨论】:

  • 感谢解决了。但实际上我想尝试 Arrays.fill 方法,因为它是今天在大学介绍的。那么有没有办法用这种方法得到同样的结果呢?
  • 我不这么认为。您用作“fill(...)”参数的任何表达式都将在实际调用该方法之前被解析,因此它对每个单元格使用相同的值,这就是“fill(...)”的设计目的。
  • 您实际寻找的是一种同时支持供应商提供的递归数组和值的填充方法。我认为这不存在,但如果您碰巧在多个地方遇到此问题,您可能会考虑至少在 2D 案例中实现它。
【解决方案2】:

我认为你有一个错误,因为方法 fill() 不能用于多维数组。只需将其转换为:

for(int k = 0;k<5;k++){
        int[] example = matrix[k];
        Arrays.fill (example, new Random().nextInt(10)*10);
 }

【讨论】:

    【解决方案3】:

    Arrays.fill() 填充一个数组。你的矩阵是一个数组数组,所以不要写

    Arrays.fill (matrix, (int) Math.random()*10);
    

    你也可以写

    int a = (int) Math.random()*10;
    matrix[0] = a; //doesn't work, matrix[0] is an int array!
    matrix[1] = a; //doesn't work, matrix[0] is an int array!
    

    等等。看看为什么它不起作用?这在两个方面是错误的。首先,fill() 不支持嵌套数组,其次,fill 接受一个值作为参数,而不是提供者。

    【讨论】:

      【解决方案4】:
          int[][] m = new int[5][5];
      
          //https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#fill-int:A-int-
          //public static void fill(**int[]** a,  int val)
          for(int[] r : m)
              Arrays.fill(r, (int) (Math.random()*10));
      
          for (int i = 0; i < m.length; i++) {
              for (int j = 0; j < m.length; j++) {
                  System.out.print(m[i][j] + " ");
              }
              System.out.println("");
          }
      
          System.out.println("Second");
      
          for (int i = 0; i < m.length; i++) {
              for (int j = 0; j < m.length; j++) {
                  m[i][j] = (int) (Math.random()*10);
              }
          }       
      
          for (int i = 0; i < m.length; i++) {
              for (int j = 0; j < m.length; j++) {
                  System.out.print(m[i][j] + " ");
              }
              System.out.println("");
          }
      Output:
      3 3 3 3 3 
      4 4 4 4 4 
      7 7 7 7 7 
      2 2 2 2 2 
      8 8 8 8 8 
      Second
      0 0 4 9 1 
      5 8 6 3 8 
      5 7 3 5 1 
      1 1 6 4 8 
      6 2 1 4 0 
      

      【讨论】: