0

私は学校のためにJavaプロジェクトを行っています。これは、そのロジックを理解するのに苦労しているコードです。それに光を当ててください。

for(int i = 0; i< leftbut.length; i++){
          int randomNumber =(int)(Math.random()*leftbut.length);
             tempNum = leftbut[randomNumber];
            leftbut[randomNumber] = leftbut[i];
            leftbut[i]=tempNum;      

     }

この場合の leftbut は、実際には 9 つのボタンの配列です。このコードは、異なる位置にある 9 つのボタンをシャッフルすることになっています。このコードがどのように機能するのか理解できません。

4

3 に答える 3

2

このコードは、元の配列のランダム順列を生成します。

ただし、これには偏りがあることに注意してください。すべての順列が一様分布で生成されるわけではありません。このスレッドでは、このバイアスの影響について説明します。

この問題を克服するには、fisher yates shuffleを参照することをお勧めします(主な違いは、範囲 [0,n) ではなく、各反復で範囲 [i,n) の乱数を生成することです)。


編集:
割り当てをメソッドにカプセル化すると、よりよく理解できるかもしれません:

private static void swap(int[] array, int i, int j) { 
       tempNum = array[j];
       array[j] = array[i];
       array[i]=tempNum; 
}

これで、コードは従うのがより簡単になります。

for(int i = 0; i< leftbut.length; i++) {
          //choose a random index in the array
          int randomNumber =(int)(Math.random()*leftbut.length);
          //swap the element in index i with the random element chosen in the array
          swap(leftbut, i, randomNumber);
}

アイデアはswap()、ランダムなインデックスを持つ配列内の各要素です。このランダム インデックスは配列からランダムに選択され、そのインデックスは として示されrandomNumberます。 周りのアイテム
だけなので、出力配列が元の配列の順列であることを簡単に証明できます。swap()

于 2013-02-03T12:53:18.990 に答える
1

leftbut 配列の要素にランダムに 9 回スワップするだけです。

于 2013-02-03T12:53:31.203 に答える
1
for(int i = 0; i< leftbut.length; i++){

ループです。変数 i を 0 に初期化し、ループごとに 1 ずつ増やします

int randomNumber =(int)(Math.random()*leftbut.length);

整数変数 randomNumber を宣言し、範囲 0 - 配列の長さのランダム値を割り当てます

 tempNum = leftbut[randomNumber];         
 leftbut[randomNumber] = leftbut[i];
 leftbut[i]=tempNum;  

これは実際には配列内の2つのボタンの位置を反転させ、値iはランダムなものになり、その逆も同様です

于 2013-02-03T12:57:23.063 に答える