3

こんにちは、私は割り当てを行っていますが、2D配列の概念に少し落ち込んでいます。2D配列内の要素をランダムに選択するメソッド本体を作成しています。しかし、いつどのように問題に取り組むのか完全にはわかりません。

乱数ジェネレーターを使ってランダムな要素を選択することを考えていました。最初に必要なのは、ボックスの全長を最初に値で埋めることです。この場合、2D配列ボックスのサイズは20x20で、値はゼロです。したがって、2D配列を完全にゼロで埋めたいと思います。乱数ジェネレーターを使用した場合でも、ボックスの寸法全体が最初にゼロで埋められる前に、ジェネレーターによってランダムに選択された要素が再び使用される可能性はありますか?

テキストの長いブロックでごめんなさい。基本的に私が求めているのは、乱数ジェネレーターを使用して、以前に使用したものを繰り返さずに、乱数をランダムに生成する方法があるかどうかです。

4

4 に答える 4

3

1つのオプションはを使用することCollections.shuffle(allCells)です。

もう1つのオプションは、残りの未使用セルを追跡することにより、次のアルゴリズムを使用することです。

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

配列にデータを入力しているときに、各セルのインデックス(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 に答える
0

私が上で読んだことから...あなたは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の境界の外側にあるため、これによって「場所」配列から同じ値が選択されることはないことがわかります。次回ループを通過するときは、その値(またはすでに使用されている他の値)を再度選択することはできません。

于 2012-10-21T20:00:24.547 に答える