2008-09-18 68 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洗牌只是一個微不足道的變化:只需在甲板剩餘(不洗牌)部分換取任何牌,而不是在整個牌組中的任何位置。如果你認爲它是從剩下的未被選中的牌中重複選擇下一張牌,這也是非常直觀的。

就個人而言,我認爲當適當的一個不復雜(並且更容易可視化!)是一種不好的方法時,教給學生一個糟糕的算法。