世界问题与幼稚洗牌

我正在撰写大量旨在通过使用与扑克相关的主题来教授开始编程概念的文章。 目前,我正在研究洗牌问题。

正如Jeff Atwood在CodingHorror.com上指出的那样,一种简单的混洗方法(遍历一个数组并在阵列的其他地方用随机卡交换每张卡)创建了不均匀分布的排列。 在实际应用中,我只是使用Knuth Fisher-Yates shuffle来获得更均匀的随机性。 但是,我并不想用编程友好的算法来解释编程概念。

这导致了一个问题:如果他们知道你正在使用一张52张牌的幼稚洗牌,黑帽子有多大优势? 看起来这将是无限小的。


这不像你正在写一个将用于实际在线赌博网站的扑克程序。 当你教人们如何编程时,有人在程序中作弊的能力并不是什么大不了的。

留言说这是一个现实世界的糟糕模式(将其视为一个可能的安全缺陷),并继续与教学。


与天真洗牌相比,knuth洗牌只是一个微不足道的变化:只需在甲板剩余(不洗牌)部分交换任何牌,而不是在整个牌组中的任何位置。 如果你认为它是从剩下的未被选中的牌中重复选择下一张牌,这也是非常直观的。

就个人而言,我认为当适当的算法不复杂(并且更容易可视化!)是一种不好的方法时,教给学生一个不好的算法。


事实证明,这个优势非常重要。 看看这篇文章

部分问题是有缺陷的算法,但另一部分是假设您可以从计算机获得“随机”数字。

链接地址: http://www.djcxy.com/p/85141.html

上一篇: world problems with naive shuffling

下一篇: Android Internal Storage why default private