私が上で読んだことから...あなたは20x202D配列を0で埋めたいが、毎回配列内のランダムな場所を選択することによってそれを行いたい、そしてあなたはスロットを「再埋め」したくない。
これを行う最も速い方法は、可能なすべての場所で配列を作成することです(この場合、値/ 20 =最初のインデックス、値%20 = 2番目のインデックスであると考えると、これは0..399です。 125=アレイ[125/20][125%20]またはアレイ[6] [5]、参照してください?)
したがって、最初に、この配列の場所[400]に値0..399を入力します。
int [][] box = new int[20][20];
int [] locations = new int[400];
for ( int i = 0; i < 400; i++ ) locations[i] = i;
次に、キャップ399から始めて、0からキャップまでの乱数locを生成し、locations [loc]を現在のインデックスとして使用して0を入力し、locations[loc]をlocations[cap]と交換します。 1でキャップし、続行します。上限が0に達するまでに、すべての場所を使用したことになります。
int cap = 399;
Random rand = new Random();
while ( cap >= 0 ) {
int rnd = rand.nextInt(cap+1);
int loc = locations[ rnd ];
box[loc%20][loc/20] = 0; // Here's where we set the value 0 into the 2D array
// now swap the location selected with the value at the "end" of the current list.
// hmm, forget the swapping, let's just bring that value in from the end.
locations[rnd] = locations[cap];
cap--; // "shrink" the current list, eliminating the value we just put at the end from consideration.
}
それはそれをする必要があります。ループの最後でスワップすると、その場所の値がインデックス0の境界の外側にあるため、これによって「場所」配列から同じ値が選択されることはないことがわかります。次回ループを通過するときは、その値(またはすでに使用されている他の値)を再度選択することはできません。