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

Java 洗牌数组背后的逻辑是如何工作的?,java,arrays,shuffle,Java,Arrays,Shuffle,我在理解数组洗牌背后的逻辑时遇到问题。如果有人能一步一步地解释,那将非常有帮助 //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] = dec

我在理解数组洗牌背后的逻辑时遇到问题。如果有人能一步一步地解释,那将非常有帮助

//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;           
}
//洗牌
对于(int i=0;i
循环一次遍历一张卡组,并将该卡与卡组中随机选择的卡进行交换。循环后,每张卡将至少交换一次。

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

虽然这不是一个完美的洗牌,因为索引
i
可能等于随机生成的索引。或者,他们可以在以后撤销先前交换的卡


有关洗牌的更多信息,您可能还想在上查看这篇文章。

让我们一步一步地浏览它

for(int i = 0; i < deck.length; i++)
注释已经说明,它生成一个随机数,并将其与甲板长度相乘。将保存在名为index的变量上,并且将是一个整数

  System.out.println(index);
这只是输出你的随机数

  int temp = deck[i];
是一个临时变量。它在位置i保存数组中的值

  deck[i] = deck[index];
将组中位置i处的值设置为位置索引处组中的值

  deck[index] = temp;         
温度将存储在甲板上的pos索引中


希望逐步帮助您

它生成一个具有数组长度上限的随机数,并将当前元素与该索引处的元素交换
int index=randomInstance.nextInt(deck.length)
会更好地使用。它是一个。@avi我不相信这是Fisher-Yates洗牌,因为以前的牌可能会在较早的位置结束,Fisher-Yates不是这样。@WJS啊,你是对的;好主意。不能保证每张卡至少交换一次。极不可能,但仍有可能。@Occs2K是的,一张卡可以自己交换,或者以后再交换,但这些细节对于理解算法的工作原理并不重要。@Occs2K我很好奇,所以我只是做了一个测试。在洗牌的100万次迭代中,有一半以上的时间一张牌落在了同一个地方。所以我想说这很有可能。非常感谢!这真的很有帮助,我知道我在哪里迷路了。
  deck[index] = temp;