洗牌数组背后的逻辑是如何工作的?

How does the logic behind shuffling an array work?

我在理解数组打乱顺序背后的逻辑时遇到了问题。如果有人可以逐步解释那将非常有帮助。

//Shuffle the cards
for(int i = 0; i < deck.length; i++) {
  //Generate an index randomly 
  int index = (int)(Math.random() * deck.length);
  System.out.println(index);
  int temp = deck[i];
  deck[i] = deck[index];
  deck[index] = temp;           
}

循环一次遍历牌组一张牌,并将该牌与牌组中随机选择的牌交换。循环后每张卡片至少被交换一次。

它只是将当前索引处的卡片与随机生成的索引处的卡片交换。生成的索引将介于 0deck.length-1 之间。

虽然索引 i 可能等于随机生成的索引,但它并不是完美的随机播放。或者他们可以稍后撤销之前交换的卡。

有关 shuffling 的更多信息,您可能还想查看有关 Fisher-Yates Shuffle algorithm 的这篇文章。

让我们一步一步来

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

For 循环,将遍历您的套牌。下面的代码将根据甲板的大小被调用。

  //Generate an index randomly 
  int index = (int)(Math.random() * deck.length);

评论已经说过了,它会生成一个随机数并将其乘以甲板长度。将保存在名为 index 的变量中,并且将是一个整数。

  System.out.println(index);

这只是输出您的随机数。

  int temp = deck[i];

是临时变量。它将数组中的值保存在位置 i.

  deck[i] = deck[index];

将牌组中位置 i 的值设置为牌组中位置索引处的值。

  deck[index] = temp;         

温度将存储在 deck 中的 pos 索引处。

希望一步步对你有所帮助