在矩阵上设置随机元素的值

时间:2016-10-22 03:10:00

标签: java for-loop matrix

我正在尝试生成一个8乘8的矩阵。矩阵的每个元素需要具有值1,除了每列上设置为0的一个元素,通过在0-7之间生成随机int来选择一个元素。

运行代码时得到的结果:

   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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

在嵌套循环中,单元格的初始化和归零都在最里面的循环中。这将导致每个单元格运行一次,但每列只进行一次归零。

如果我们改变单元格从列之后的行到列的初始化顺序,我们可以将归零逻辑移到最外面的循环。

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
}

答案 2 :(得分:0)

首先,使用Arrays.fill api,它将使您的代码更清晰,更简洁。

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

然后,对于每一行,随机选择一个列号并插入&#39; 0&#39; 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;
}