我正在撰写一些文章,旨在通过使用与扑克相关的主题来教授开始编程概念.目前,我正在研究洗牌问题.
正如Jeff Atwood在CodingHorror.com上指出的那样,一个简单的改组方法(迭代数组并用阵列中其他地方的随机卡交换每个卡)会产生不均匀的排列分布.在实际应用中,我会使用Knuth Fisher-Yates shuffle来获得更均匀的随机性.但是,我不想用更少编码器友好的算法来解释编程概念.
这就产生了一个问题:如果黑帽子知道你正在使用52张牌的天真洗牌,那么黑帽子有多大的优势呢?看起来它会无限小.
与天真洗牌相比,knuth shuffle是一个微不足道的变化:只需更换甲板上剩余(未洗涤)部分的任何卡片,而不是整个牌组中的任何位置.如果您认为它是从剩余的未选择卡片中按顺序重复选择下一张卡片,那么它也非常直观.
就个人而言,我认为当正确的算法不复杂(并且更容易想象!)时,教学生的算法很差,这是一种糟糕的方法.
事实证明,优势非常显着. 看看这篇文章
部分问题是有缺陷的算法,但另一部分假设您可以从计算机获得"随机"数字.