2012-10-09 59 views
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什么?

+0

当你说“n = 0”时,你的意思是n在while循环之前等于0吗?如在中,数组中没有元素? – DanielGibbs

回答

1

在您的代码段

while(n--!=0) 

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

Refer this link

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