1

このコードは完全なシャッフルアルゴリズムに対して正しいですか?私は常に0からnまでの数値を生成し、その数値を配列の最後の要素と交換して、nの範囲を狭めようとしています。ただし、n = 0の場合、例外が発生します。このケースにどのように対処しますか?

    int [] array ={1,2,3,4,5};
    Random random = new Random();
    int n=array.length;

    while(n--!=0)
    {
        int number = random.nextInt(n);
        int temp = array[n];
        array[n] = array[number];
        array[number] = temp;
    }

編集:それを--n> 0に変更すると、正しく機能しますが、その場合、n = 0に対して何もしないため、シャッフルアルゴリズムを正しく実装していますか?

4

2 に答える 2

1

コードセグメント内

   while(n--!=0) 

 if n is 1, it will become 0 and `random.nextInt(0)` will return an error.

このリンクを参照してください

于 2012-10-09T01:45:26.367 に答える
0

0の引数を渡した場合、nextIntは機能しないと思います。

シャッフルする最良の方法は、FisherYatesアルゴリズムを使用することです。高速で、インプレースで動作し、偏りがありません。

int [] array = {1,2,3,4,5};
Shuffle(array, new Random());

// Fisher Yates shuffle - see http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
void Shuffle(int[] array, Random RNG)
{
    for (int i = array.length - 1; i >= 1; i -= 1)
    {
        // get integer in range of j >= 0 && j < i + 1
        int j = RNG.nextInt(i + 1);
        //assert(j >= 0 && j <= i);
        if (i != j)
        {
            // only swap if i and j are different
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
}
于 2012-10-09T01:57:39.590 に答える