2016-10-22 32 views
0

我試圖生成一個8乘8的矩陣。除了每列設置爲0的一個元素之外,矩陣的每個元素都需要有一個值1,通過在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

什麼問題? – Alex

+0

@Alex如果您運行代碼,您會看到它跳過一些列或在同一列中創建兩個0值。 – PRCube

+0

啊,好的。這是因爲你把這兩個任務都放在最裏面的循環中,導致它們每個單元都運行一次。你需要在每個單元格上將單元格設置爲1,但是你只需要每列選擇一個0 – Alex

回答

1

在你嵌套循環,單元的初始化和歸零都在最裏面的循環中。這將導致每個單元都運行一次,但每個列只能執行一次空值。

如果我們改變單元格從列之後的行到列之後的初始化順序,我們可以將nulling邏輯移出到最外層的循環。

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 
} 
+0

謝謝,工作正常。 – PRCube

0

首先,使用陣列。填充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; 
} 
+0

不幸的是我仍然有同樣的問題。有些列跳過沒有0,有些有多個0。我更新了代碼。 – PRCube

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)的