我正在尝试生成一个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();
}
答案 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;
}