為了研究蜘蛛紙牌的規則,我玩了200局!

Trevor Tao發表於2020-08-10
單人蜘蛛接龍(以下簡稱為“蜘蛛紙牌”)是人們經常在電腦上線上或者離線玩的一款很受歡迎的遊戲。由名字可以看出,這個遊戲是隻有一個玩家的。遊戲中一共有兩套標準撲克牌,玩家需要按順序把撲克牌排列成完整的八組(兩套牌,各四種花色),從而進一步把它們從檯面上消除。牌可以從牌組中提取或者按照特定規則從一列移動到另一列。我們這裡不再詳細地討論遊戲規則,假設我們的讀者已經瞭解遊戲的規則了。在這裡我們只討論這個遊戲的四組的版本。

為了研究蜘蛛紙牌的規則,我玩了200局!
蜘蛛紙牌中含有兩套標準撲克牌

玩家們一直在抱怨說不同的軟體存在偏差。具體來講,就是如果程式探測到了玩家的勝率很高,它可能就暗中操縱後面的牌的次序來降低勝率。玩家本身也有可能被偏向從而發揮出最好水平。不過,通過一些基本的統計學手段,我們有可能對這種“偏向的指控”進行證實或者駁斥。這一點也可以作為一個很好的練習,來看看一個人是如何使用在現實世界觀察到的資料並配合統計學手段來判斷一個假說(比如“蜘蛛紙牌程式是有偏向性的”)是真的還是假的。

基礎知識

從本文的角度出發,我們這裡假設玩家在玩蜘蛛紙牌的時候不使用“撤銷”“重來”“加步”(把遊戲削減為一個簡陋的初始版本),這樣玩家就不用考慮計分、花費的時間以及移動的步數了。很多人都認為在這樣的條件下游戲幾乎贏不了,但是加州州立大學長灘分校的史蒂夫·布朗在他出色的著作《蜘蛛紙牌獲勝策略》中給出了一些詳細的策略,並且提到在306局遊戲中可以取得48.7%的勝率。同時他也指出自己的玩法還不是完美的,那些專業玩家可以做得更好,甚至達到超過60%的勝率。我利用了布朗的這些策略進行了實驗,結果表明確實能夠達到超過48.7%的勝率。

理想情況下,電腦端蜘蛛紙牌遊戲能夠模擬真實情況下且洗牌充分的紙牌遊戲。如果在遊戲的任何一個節點,有 N 張牌還沒被看過,那麼每張牌都有 1/N 的可能性作為下一張翻面的牌出現(為了敘述的方便,我們忽略了具有相同花色和大小的紙牌之間的等價性)。舉個例子,在起始位置我們知道有 10 張牌被亮了出來。因為總共的 104 張牌裡一共有 8 張 K,所以單張亮出來的牌是 K 的概率是 8/104=1/13,因此亮出來的牌是 K 的期望張數是 10×1/13=10/13。如果在玩了相當多局數的遊戲之後,我們發現亮出來K的數目平均下來接近 11/13,我們就有理由相信這款蜘蛛牌程式是有偏向性的。

測試資料

對於每一局遊戲來說我們都希望記錄一組能夠反映牌運氣好壞的資料,數值越高,證明獲勝的機率越大。我們想到的一個方案是評估在一局絕對公平、無偏袒性的遊戲裡,這些測試資料的取值,再和我們懷疑可能存在偏向性的遊戲中記錄的資料值進行比較。

一旦最初的十張牌都確定下來,我們就能計算出“保證輪數(guaranteed turns,GT)”,即玩家在被迫更換至另一排之前能夠確定亮出的牌的最少數目。無論何時,當新的一排的十張牌已經確定下來後,我們都可以做一個類似的計算,假裝它是新的一局遊戲的開始。這樣一來我們就可以計算出GT的平均值(AGT)。如果幾輪下來GT的值很小,那麼玩家就要有麻煩了。要說明的是AGT和玩家本身無關,所以很容易通過進行很多次實驗(即確定很多排)來模擬出AGT的概率分佈。

經驗來談,如果卡牌的整體分佈比較糟糕的時候,玩家同樣會陷入麻煩。比如說有七張Q但是隻有兩張J沒有打出來的時候,即使你有一列或者多列已經清空,仍然會有問題出現。因此在這裡定義一個整體方差(total square variation,TSV),取值為相鄰大小的牌的數目的負的平方之和。在剛才的例子裡,七張 Q 和兩張 J 在求和時會貢獻出 -(7-2)2=-25 一項。這裡取負值是為了確保 TSV 的增減性與獲勝概率的增減性一致,就和AGT一樣。每亮出一張新牌我們就計算一下TSV,這樣我們可以算出來單局遊戲的平均TSV(ATSV)。要提起注意的是ATSV同樣與玩家無關,我們假定玩遊戲的玩家會按照一個隨機順序把所有扣著的牌都亮出來(儘管玩家可以選擇先亮哪張牌,但是亮出的每張牌概率是一樣的)。幸運的是這一點可以通過模擬很容易就做到。

為了研究蜘蛛紙牌的規則,我玩了200局!
蜘蛛紙牌的典型散點圖(○=獲勝,×=落敗)

一個典型的散點圖如上圖,這裡藍色圓圈和紅色叉叉依次表示獲勝和落敗。

模擬結果顯示對於沒有偏袒的遊戲程式而言,在大量局數的遊戲之後,AGT應該等於3.96而ATSV應該等於-32.29。在下面這個示例的起始位置中,GT=1,TSV=-42,因為這局遊戲還沒結束,我們還不知道AGT和ATSV的值是多少。

為了研究蜘蛛紙牌的規則,我玩了200局!
示例,起始位置GT=1,TSV=-42

計算如下:

為了研究蜘蛛紙牌的規則,我玩了200局!

假設檢驗

為了檢驗一個蜘蛛紙牌遊戲是不是有偏向性,我們採用一種叫假設檢驗的手段。我們先制定一個零假設(意思就是我們懷疑的效應可能不存在),在我們這裡是指“蜘蛛紙牌程式並不存在偏向性”,那互補的假設就是“蜘蛛紙牌程式故意使絆子使得玩家的勝率下降”。

首先選取一個較大的數N作為待檢測的蜘蛛紙牌遊戲的局數,然後每一局我們計算一次AGT和ATSV。接下來的總體思路是求出我們要比對的觀察結果的概率(即P值),或者更極端一點說,零假設為真(即程式沒有偏向性)的概率。如果概率低於某一個閾值(即顯著性水平),一個沒有偏向性的程式就不太可能產生我們在N局遊戲中觀察到的這種AGT和ATSV值,那我們就拒絕零假設並且得到“遊戲有偏向性”的結論。

那我們如何計算得到 p 值,即觀察到我們已經觀察到的AGT和ATSV值(這證明遊戲沒有偏向性)的概率呢?在模擬中我們已經得到了在無偏向性的遊戲中AGT和ATSV的期望值,依次是3.96和-32.9。更有意思的是,概率論會告訴我們,在無偏向性的遊戲中AGT和ATSV的值是如何分佈的,換句話說,它可以幫助我們計算出觀察到某一特定AGT和ATSV值的概率。所謂的“學生 t 檢驗”可以把所有這些數值考慮進去並得出我們想要的p值。詳細內容這裡略過,有興趣的可以參照概率與統計的相關內容。

從本文的角度出發我們選擇 N=100 作為我們玩這個待檢驗的遊戲程式的局數,得到了顯著性水平值為 0.05。

勝率估計

除了AGT和ATSV之外,我們也想評估一下對於“無偏向性”的蜘蛛紙牌程式來講,“真正的”獲勝概率。一個明顯的困難在於勝率是和玩家有關的,所以很難驗證“一個玩家能贏50%的遊戲”這種說法。另一個情況是我在不同的蜘蛛紙牌遊戲程式中得到了從45%到60%的勝率,而且沒有證據顯示我在使用這些程式的過程中勝率有所提高(也就是說,我的勝率並不隨著時間增加而呈現出正相關)。

一個比較有意思的免費線上紙牌遊戲網站 Pipkin's Idiot's Delight Solitaire Server,這裡麵包含了許許多多的紙牌遊戲。它允許玩家在從1到999999的數字中指定一個“種子數”。舉例來說,如果種子數為142857,起始的10張牌就總是2J56J9JQ59這幾張,但是組合方式會不同。要注意的是,要是玩家在遊戲之前隨機生成一長串種子數,那麼程式就不能根據玩家的勝率來調整難度水平了。正是因為這個原因,可以選擇這個網站來估計勝率。

為了研究蜘蛛紙牌的規則,我玩了200局!

在零假設為真的時候拒絕零假設被稱為第一類錯誤,它出現的概率等於顯著性水平。假說檢驗中的另一類錯誤被稱為第二類錯誤,它是指在零假設為假的情況下接受零假設。

我在Idiot's Delight上玩了100局遊戲,使用了從1到100的種子數。最終我贏了59局,輸了41局。所以我估計我在玩“無偏向性”的蜘蛛紙牌遊戲的時候勝率會在59%左右。

估計值

我在Free Spider Solitaire上玩了100局蜘蛛紙牌遊戲。雖然選擇了在這裡玩遊戲但是試驗之後,這裡的遊戲體驗真的很“糟糕”:儘管可以贏,但是就算高手玩家玩起來也會很困難。每一局遊戲記錄下遊戲的輸贏結果以及AGT和ATSV資料。我觀察到AGT和ATSV的p值依次是 0.115 和 0.201。這意味著AGT和ATSV的資料都要低於預期(也就是說,玩家會吃虧),但是因為這兩個數值都高於我們的0.05的閾值,它們在統計上都不顯著:這可能是因為偶然變化導致了較低的值的出現。

不幸的是我只贏了其中的46局,比預期少了13局。這說明可能還需要進一步測試驗證。然而要知道每個玩家的勝率都不一樣,我很有可能在這100局裡還沒有發揮出最佳狀態。

從中我給出的結論是沒有足夠的證據證明Free Spider Solitaire上的程式是有偏向性的。46局的勝局數是有一點讓人沮喪,但是確實,這次這個程式經受住了考驗。然而其他的蜘蛛紙牌程式可能就沒這麼幸運了。

作者:Trevor Tao
翻譯:Dannis
審校:Nuor
來源:中科院物理所
原文:https://mp.weixin.qq.com/s/0McQ5pfSSDqhp3Xt_7jHOg

相關文章