从我上面读到的...你想用 0 填充一个 20x20 2D 数组,但你想通过每次在数组中选择一个随机位置来做到这一点,并且你不想“重新填充”一个插槽.
最快的方法是创建一个包含所有可能位置的数组(在这种情况下,即 0..399,如果您认为 value/20 = 第一个索引,并且 value%20 = 第二个索引,例如125 = 数组[125/20][125%20] 或数组[6][5],看到了吗?)
所以,首先,用值 0..399 填充这个数组位置 [400]。
int [][] box = new int[20][20];
int [] locations = new int[400];
for ( int i = 0; i < 400; i++ ) locations[i] = i;
然后,从上限 399 开始,生成一个从 0 到上限的随机数 loc,并使用位置 [loc] 作为当前索引填充 0,然后将位置 [位置] 与位置 [上限] 交换,减少上限为 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 的边界之外以进行上限。下一次循环时,不可能再次选择该值(或任何其他已使用的值)。