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 个按钮打乱在不同的位置。我只是无法理解这段代码是如何工作的。

4

3 回答 3

2

该代码生成原始数组的随机排列

但是,请注意这是有偏差的——它不会生成均匀分布的所有排列。该线程讨论了这种偏见的影响。

为了克服这个问题 - 你可能想看看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()周围的项目,因此您可以轻松证明输出数组是原始数组的排列。

于 2013-02-03T12:53:18.990 回答
1

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

于 2013-02-03T12:53:31.203 回答
1
for(int i = 0; i< leftbut.length; i++){

是一个循环,它将变量 i 初始化为 0,并在每个循环中将其递增 1

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

声明整数变量 randomNumber 并在 0 范围内分配一个随机值 - 数组长度

 tempNum = leftbut[randomNumber];         
 leftbut[randomNumber] = leftbut[i];
 leftbut[i]=tempNum;  

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

于 2013-02-03T12:57:23.063 回答