2008-09-18 65 views
4

我正在写一些文章,旨在通过使用与扑克相关的主题来教授开始的编程概念。目前,我正在研究洗牌问题。天真洗牌的真实世界问题

作为Jeff Atwood points out on CodingHorror.com,一种简单的洗牌方法(遍历数组并将每张卡与数组中其他位置的随机卡交换)创建了不均匀的置换分布。在实际应用中,我只是使用Knuth Fisher-Yates shuffle来获得更均匀的随机性。但是,我并不想用编程友好的算法来解释编程概念。

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

回答

1

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

留下一个说明,说这是一个现实世界的糟糕模式(将其作为一个可能的安全漏洞参考),并继续与教学。

+0

不,但阅读这些文章的人可能会继续。正确地进行洗牌是很重要的,因为做错了之前已经造成了休息。 – afrazier 2010-05-17 14:19:10

+0

我在写这篇文章的时候并没有意识到这种差异是如此微不足道。我会同意:告诉他们好的洗牌算法。也许关于“为什么”的确切细节可以是“参考这些文献”。 – 2010-05-27 20:32:36

1

主观。

它看起来会是无限小。

同意。

6

事实证明,优势非常显着。 Check out this article

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

3

一个简单的&混洗的公平算法将分配一个随机的浮点数(例如0和1之间)到卡组中的每张卡,然后按指定的数字对卡组进行分类。

这实际上是一个很好的例子,让学生认识到,仅仅因为某些东西是直观的,在我们的例子中天真的洗牌并不意味着它是正确的。

+1

有人可以支持KG说的话(如果它有价值的话)?如果我没有阅读杰夫的文章,这是我选择的方法,但我是一个简单的穴居人,火吓着我。 – willc2 2009-04-01 22:00:35

1

就像旁边,有一个blog post over on ITtoolbox关于洗牌,可能是模拟洗牌时感兴趣的。

至于你的问题,请考虑有52!甲板配置可以从这个开始,可能会在杰弗的3张牌组的示例中发挥作用,请注意,每个插槽中出现1次的情况都会出现一次。另外请注意,他说你必须有几千个例子才能明白优势在哪里,但是对于套牌,你不可能再次用完全相同的初始套牌重新开始,是吗?你可以拿下发牌并把它们放在底部,然后将它们洗牌,这是我不会重复的。

13

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

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