4

我正在写一些文章,旨在通过使用与扑克相关的主题来教授初级编程概念。目前,我正在研究洗牌的主题。

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

这就引出了一个问题:如果黑帽知道你使用的是 52 张牌的天真洗牌,他们会有多大的优势?似乎它会无限小。

4

6 回答 6

14

与幼稚的洗牌相比,knuth 洗牌是一个微不足道的变化:只需与牌组剩余(未洗牌)部分中的任何一张牌交换,而不是整个牌组中的任何一张牌。如果您将其视为从剩余未选择的卡片中按顺序重复选择下一张卡片,它也非常直观。

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

于 2008-09-18T21:20:19.380 回答
6

事实证明,优势非常显着。 看看这篇文章

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

于 2008-09-18T20:57:14.287 回答
3

一个简单且公平的洗牌算法是为一副牌中的每张牌分配一个随机浮点数(例如,在 0 和 1 之间),然后按分配的数字对一副牌进行排序。

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

于 2008-09-18T21:09:00.437 回答
1

顺便说一句,在 ITtoolbox 上有一篇关于 shuffle 的博客文章,在模拟 shuffle 时可能会很有趣。

至于你的问题,考虑一下有52个!一个可以开始的牌组配置可能会影响事物的着陆位置,如 Jeff 的 3 张牌组示例,请注意,过度代表中的 1 在每个插槽中出现一次。另请注意,他说您必须有几千个示例才能明显优势在哪里,但是对于套牌,您不太可能从完全相同的初始套牌重新开始,是吗?你会拿起发牌并将它们放在底部并洗牌,我认为这不太可能重复。

于 2008-09-18T21:13:42.003 回答
0

这不像您正在编写将用于实际在线赌博网站的扑克程序。当您教人们如何编程时,某人在程序中作弊的能力并不重要。

留言说这是一个糟糕的现实世界模型(将其称为可能的安全漏洞),然后继续进行教学。

于 2008-09-18T20:59:27.777 回答
-1

主观。

似乎它会无限小。

同意。

于 2008-09-18T20:54:57.227 回答