2013-02-03 139 views
0

我有一个为学校完成的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个按钮混洗。 我只是不明白这个代码是如何工作的。

+0

你想让我们为你做功课吗? – imrichardcole

+0

不是有用的答案吗? – lelloman

+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()项左右,您可以很容易地证明输出数组是原始的排列。

+0

所有9个按钮都包含一个ImageIcon。如果这段代码随机生成数字,则洗牌JButton。会有重复的ImageIcon不重复的按钮? –

+0

@ user2016977排列不包含双精度,所以如果原始列表中的元素都是唯一的,则结果列表也将具有唯一的所有元素。 – amit

+0

什么是解释这个简单的方法? –

1

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

+0

所有9个按钮都包含一个ImageIcon。如果这段代码随机生成数字,则洗牌JButton。会有重复的ImageIcon不重复的按钮? –

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

是一个循环,它inizialize变量i为0,并增加它由1

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

每个环路声明整数变量randomNumber和在范围0分配一个随机值 - 阵列

的长度
tempNum = leftbut[randomNumber];   
leftbut[randomNumber] = leftbut[i]; 
leftbut[i]=tempNum; 

这实际上反转阵列中的2个按钮位置时,值i成为随机的一个,反之亦然