有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

矩阵上随机元素的java集值

我想生成一个8乘8的矩阵。矩阵的每个元素都需要有一个值1,除了每列上的一个元素被设置为0之外,该元素是通过在0-7之间生成一个随机整数来选择的

运行代码时得到的结果:

   1     1     1     1     1     1     1     1  
   1     1     1     0     1     1     1     1  
   1     1     0     1     1     1     1     1  
   1     0     1     1     1     1     1     1  
   1     0     1     1     1     1     1     1  
   1     0     0     1     1     1     1     1  
   1     1     1     1     1     1     1     1  
   1     1     1     1     1     0     1     1  

我的矩阵应该如下所示:

   1     1     1     1     1     1     1     1  
   1     1     0     1     1     1     1     1  
   1     1     1     1     1     0     1     0  
   0     1     1     1     1     1     1     1  
   1     1     1     0     1     1     0     1  
   1     0     1     1     1     1     1     1  
   1     1     1     1     1     1     1     1  
   1     1     1     1     0     1     1     1  

代码

    for (int[] row: grid)
        Arrays.fill(row, 1);

    for (int i=0; i<grid.length; i++) {
       int j = getRandom();
       grid[i][j] = 0;
    }

    // print matrix
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++)
            System.out.format("%2s%2d%2s", " ", Main.grid[i][j], " ");

        System.out.println();
    }

共 (3) 个答案

  1. # 1 楼答案

    首先,让我们将矩阵全部设为1:

    //fill however you like
    int[][] matrix = IntStream.range(0, 8).mapToObj(i
                     -> IntStream.range(0, 8).map(i -> 1).toArray());
    

    然后,根据您的问题,您似乎希望每列的唯一行具有零。所以只需洗牌您的列索引:

    List<Integer> rows = IntStream.range(0, 8).collect(Collectors.toList());
    Collections.shuffle(rows); //random rows per 0-8 column
    AtomicInteger column = new AtomicInteger();
    //iterate columns, and select random row
    rows.forEach(i -> matrix[i][column.getAndIncrement()] = 0);
    

    这将分散随机0,使其在每行(和每列)都是唯一的,并且实际上不涉及任何RNG,因此它是O(n)

  2. # 2 楼答案

    首先,使用数组。填充api,它将使您的代码更加干净简洁

    int[][] matrix = new int[m][n];
    // Fill each row with 1
    for (int[] row: matrix)
        Arrays.fill(row, 1);
    

    然后,对于每一行,随机选取一个列号并插入“0”,从而替换1

    for(int i=0; i<matrix.length; i++) {
       int j = Math.Random(0,matrix[0].length); // Or any other api for random number generation
       matrix[i][j] = 0;
    }
    
  3. # 3 楼答案

    在嵌套循环中,单元格的初始化和置零都在最内层循环中。这将导致这两个函数在每个单元格中运行一次,但在每个列中只执行一次调零操作

    如果我们将单元格的初始化顺序从一行一行改为一列一列,我们可以将调零逻辑移到最外层的循环

    for (int c = 0; c < 8; c++) {
        for (int r = 0; r < 8; r++) {
            Main.grid[r][c] = 1;
        }
    
        Main.grid[getRandom()][c] = 0; // assuming your getRandom() is within range
    }