完美的shuffle算法实现错误

时间:2012-10-09 01:25:52

标签: java

此代码是否适用于完美的随机播放算法?我总是试图生成一个从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做过任何事情?

2 个答案:

答案 0 :(得分:1)

在您的代码段

   while(n--!=0) 

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

Refer this link

答案 1 :(得分:0)

如果传递参数0,我认为nextInt不起作用。

洗牌的最佳方式是使用Fisher Yates algorithm。它速度快,就地工作,并且不偏不倚:

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;
        }
    }
}