【问题标题】:How does the logic behind shuffling an array work?洗牌数组背后的逻辑是如何工作的?
【发布时间】:2019-10-16 17:16:27
【问题描述】:

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

//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 index = randomInstance.nextInt(deck.length) 会更好用。
  • 这是一个Fisher-Yates shuffle
  • @avi 我不相信这是费舍尔-耶茨洗牌,因为之前的牌可能最终会回到他们之前的位置,而费舍尔-耶茨的情况并非如此。
  • @WJS 啊,你是对的;很好的收获。

标签: java arrays shuffle


【解决方案1】:

一步一步来吧

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];

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

  deck[index] = temp;         

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

希望一步一步对你有所帮助

【讨论】:

  • 非常感谢!这真的很有帮助,我知道我在哪里迷路了。
【解决方案2】:

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

【讨论】:

  • 不保证每张卡至少被交换一次。极不可能,但仍有可能。
  • @locus2k 是的,一张卡可以与自己交换,或者稍后再交换并交换回来,但这些细节对于理解算法的工作原理并不是那么重要。
  • @locus2k 我很好奇,所以我只是做了一个测试。在 100 万次洗牌迭代中,一张牌出现在同一个地方的时间只有一半多一点。所以我会说这很有可能。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2014-03-21
    • 2021-12-30
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多