我正在撰写一些文章,旨在通过使用与扑克相关的主题来教授初级编程概念。目前,我正在研究洗牌的主题。
作为Jeff Atwood points out on CodingHorror.com ,一种简单的洗牌方法(遍历数组并将每张牌与数组中其他地方的随机牌交换)会产生不均匀的排列分布。在实际应用中,我只会使用 Knuth Fisher-Yates shuffle以获得更均匀的随机性。但是,我不想用对编码器不太友好的算法来解释编程概念。
这引出了一个问题:如果黑帽黑客知道您正在使用 52 张牌的简单洗牌,他们会有多大优势?看起来它会无限小。
最佳答案
与原始洗牌相比,knuth 洗牌是一个微不足道的变化:只需交换牌组剩余(未洗牌)部分中的任何一张牌,而不是交换整个牌组中的任何一张牌。如果您将其视为从剩余未选择的卡片中按顺序重复选择下一张卡片,这也非常直观。
就我个人而言,我认为当正确的算法不再复杂(并且更容易可视化!)时,教给学生一个糟糕的算法是一种糟糕的方法。
关于algorithm - 朴素洗牌的现实问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/96840/