電腦中有一款比較簡單的游戲:蜘蛛撲克。難度也可以從一種花色、兩種花色、到四種花色。
這個游戲的核心技巧,就是堆棧(stack)技術,對于計算機軟件專業的人員來說,這其實是一項基本技術。所以,我如果有時玩這個游戲的話,總是選擇四種顏色的難度,取得若干連勝也是比較常見的。
這個游戲有個規則,就是有空位時,是不許發牌的。我現在的問題是,如果上面的撲克數量不足十張的時候,怎么辦?會出現這樣的問題嗎?
要出現這個上面說的問題,就必須滿足,最后一組沒有發出的牌,必須是同一種花色且不能重復。(事實上,最后剩下兩組時,保證花色不超過兩種,且分組之后不重復;最后剩下三組時,保證花色不超過三種,且分組之后不重復。都是可能出現問題的。這里不討論這部分。)
這樣的概率是多大呢?
對于四種顏色,概率為 4C(13,10)/C(52,10),概率大致是億分之7。
對于二種顏色,概率增大了512倍,大致是十萬分之3.7。
對于一種顏色,概率再增大了512倍,大致是百分之1.9。
也就是說,出現最后十張沒有發出來的撲克是完全不重復的,在選擇一種顏色的難度時,概率還比較大。為了找到這樣的現象,就反復發撲克,并檢驗最后的十張撲克,大約數十次之后,就出現了期望的結果。
這個結果有什么用呢?會出錯!
我們不妨假定,這個程序非常的優秀,并且經過千錘百煉的檢驗,但事實上它還是會出現錯誤。這種不易被發現的錯誤,就是程序員的苦惱,就是你很難保證程序完全正確。這或許算作一個實例。
圖片發自簡書App
圖一:最后十張撲克出現完全不重復的情況。
圖片發自簡書App
圖二:游戲進行中。由于程序的錯誤,導致無法繼續了。解決的辦法,要么允許上面的撲克,不足十張時,有空位可以發牌;要么不允許“最后一組十張撲克是一套花色且不重復”。