请帮我理解这段代码

时间:2013-02-03 12:51:29

标签: java

我为学校完成了一个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个按钮。 我只是无法理解这段代码是如何工作的。

3 个答案:

答案 0 :(得分:2)

代码会生成原始数组的随机permutation

但请注意,这是有偏见的 - 它不会在均匀分布中生成所有排列。 This thread讨论了这种偏见的影响。

要解决此问题,您可能需要查看 fisher yates shuffle (主要区别在于,在每次迭代中生成范围[i,n]中的随机数)在范围[0,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()项,你可以很容易地证明输出数组是原始数据的排列。

答案 1 :(得分:1)

它只有9次随机交换到leftbut数组的元素。

答案 2 :(得分:1)

for(int i = 0; i< leftbut.length; i++){

是一个循环,它将变量i inizialize为0,并将每个循环递增1

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

声明整数变量randomNumber并在范围0 - 数组长度

中分配随机值
 tempNum = leftbut[randomNumber];         
 leftbut[randomNumber] = leftbut[i];
 leftbut[i]=tempNum;  

这实际上反转了数组中的2个按钮位置,值i成为随机值,反之亦然