此代码是否适用于完美的随机播放算法?我总是试图生成一个从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做过任何事情?
答案 0 :(得分:1)
在您的代码段
中 while(n--!=0)
if n is 1, it will become 0 and `random.nextInt(0)` will return an error.
答案 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;
}
}
}