2016-10-22 4 views
0

私は8行8列の行列を生成しようとしています。行列の各要素は、各列の1つの要素が0に設定され、1つの要素が0〜7の間のランダムなintを生成することによって選択される以外は1の値を持つ必要があります。マトリックス上のランダム要素の設定値

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コードを実行すると、いくつかの列がスキップされるか、同じ列に2つの0値が作成されます。 – PRCube

+0

Aah ok。これは、これらのタスクを最も内側のループの内側に配置して、それらを両方ともセルごとに1回実行させるためです。すべてのセルでセルを1に設定する必要がありますが、カラムごとに0を選択する必要があります – Alex

答えて

1

をあなたにネストされたループでは、セルの初期化とヌル化の両方が最内ループにあります。これにより、両方がセルごとに1回実行されますが、ヌル化は列ごとに1回だけ実行されます。

セルが初期化される順序を行の後の行から列の後の列に変更すると、NULLのロジックを最も外側のループに移動できます。

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

まず、配列を使用して、私は、コードを実行したときに、私は何を得る

。 fill 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

を交換するのをマトリクス全て1Sしてみましょう:

//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を分散させるだろう、それはO(n)がですので、関係するすべてのRNGは、実際にそこではないのです

関連する問題