3

嗨,我正在做一项任务,但我对二维数组的概念有点落伍了。我正在编写一个随机选择二维数组中的元素的方法体。但是,我不完全确定何时解决该问题。

我正在考虑使用随机数生成器来选择一个随机元素。虽然我首先需要的是首先用一个值填充整个盒子的长度。在这种情况下,二维数组框的尺寸为 20x20,值为零。所以我希望二维数组完全用零填充。虽然如果我使用随机数生成器,那么在整个框尺寸首先用零填充之前,是否有可能再次使用生成器随机选择的元素?

对不起,很长的文字块。基本上我要问的是是否有一种方法可以使用随机数生成器仍然随机生成数字但不重复以前使用的任何数字。

4

4 回答 4

3

一种选择是使用Collections.shuffle(allCells).

另一种选择是使用以下算法,通过跟踪剩余的未使用单元:

1. Find a random number from 0 to size of the set - 1 .
2. Remove number at position `randomNumber` from the set.
3. Go to 1.
于 2012-10-21T19:49:33.237 回答
1

我会这样:

        int [][] myArray = new int[4][5]; //Any size and type
        int totalEmenent = myArray.length *myArray[0].length;
        int indexToSelect = (int)(Math.random()*totalEmenent);
        int xIndex = (int)indexToSelect/myArray.length;
        int yIndex = indexToSelect%myArray.length;
        int selectElement = myArray[xIndex][yIndex];

如果您希望每次都选择唯一索引:

        int [][] myArray = new int[4][5]; //Any size and type
        int totalEmenent = myArray.length *myArray[0].length;
        String selectedIndex = "";
        int numberOfSelect = 10; //Any number< totalEmenent

         for(int indx=0; indx< numberOfSelect; indx++){
              int indexToSelect = (int)(Math.random()*totalEmenent);
              //generate random until its unique
              while(selectedIndex.indexOf(String.valueOf(indexToSelect))> 0){
                   indexToSelect = (int)(Math.random()*totalEmenent);
              }
              selectedIndex = selectedIndex+indexToSelect;
              int xIndex = (int)indexToSelect/myArray.length;
              int yIndex = indexToSelect%myArray.length;
              int selectElement = myArray[xIndex][yIndex];
         }
于 2012-10-21T19:50:58.903 回答
0

从我上面读到的...你想用 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 的边界之外以进行上限。下一次循环时,不可能再次选择该值(或任何其他已使用的值)。

于 2012-10-21T20:00:24.547 回答
0

在填充数组时,您可以有一个数组列表来添加每个单元格的索引(比如 i,j),然后生成随机数

Arraylist<int[]> ar=new Arraylist();
//inside loop for populating array
    yourArray[i][j]=whatever;
    ar.add({i,j});
//loop ends

int index=new Random().nextInt(ar.size());
int[] arrayIndex=ar.get(index);
ar.remove(index);
row=arrayIndex[0];
column=arrayIndex[1];
(Type)randomElement=yourArray[row][column];
于 2012-10-21T20:22:26.420 回答