刊登於中國橋藝2000年7月 高雄橋訊2000年7月 電腦如何洗牌 楊昌彪   高雄市橋藝中心於每年農曆過年後的新春假期,均會舉行三個場次雙人賽,獎品 相當豐富,而且人人均有獎。葉澄先生87年11月就任體育會橋藝委員會主任委員,對 高雄市橋藝中心的比賽更是大力贊助,使得許多比賽有實質利多。因此,其中88年在 高雄市橋藝中心舉行的第三次新春雙人賽(名之為新春樂透杯雙人賽)於88年2月28 日舉行,共有二十四對賽員,總共十二桌進行比賽。比賽方式為四分之三浩威爾(3/4 Howell),共打二十六付牌,分十三圈打完。比賽第一名的獎金為一萬元。   比賽結果,第一名與第二名只相差一個序分,不過獎品內容差距卻頗大。其中有 一付牌,第二名者被詐叫,而得個鴨蛋,因此更加懊惱不已。整付牌如下:      SAK1076      HQ1097      DA3      CK10 S982       S4 H─         HJ843 DJ10542     DKQ98 CQ9864     CJ732      SQJ53      HAK652      D102      CA5 雙方無身價,西家開叫,叫牌過程如下:  N  E  S  W           2N  P  3C  P  P  ×  P  P  P   東西家是兩位極少一起搭檔的橋友,西家抓到機會詐開叫2N,表示21至22點平均 牌型。北家雖然也拿了強牌,但是不敢造次,只能先派司。東家按照正常答叫3C,表 示史蒂曼問高花。東家的答叫正符合西家的預期,當然派司。北家此時已經知道西家 是詐叫,所以出聲賭倍。但是南家不知道西家詐叫的情況,也不知道北家的點力或是 梅花牌組的分配,只好派司。叫牌結束,首攻後,不出半分鐘,即可打完此牌。東西 家的牌點力雖少,但配合得天衣無縫,所以3C賭倍做成合約。看了南北兩家的牌,7H 、7S、7N都是打不垮的合約。雖然南北家不一定能叫到大滿貫,可是叫到小滿貫應是 輕而易舉之事。除了第二名的賽員以外,該次比賽南北有五對叫到大滿貫,其餘叫到 小滿貫。所此牌的結果有天壤之別,第二名的賽員得了一個大鴨蛋。   高雄市橋藝中心最近的許多比賽,為了使賽後有牌局可資討論,總幹事蕭家博先 生力求改革,使用電腦做牌比賽(由值班幹事先行用撲克牌依照電腦牌局做好牌)。 許多人都稱許這項措施,也相信對於提升高雄橋藝水準有所助益。   不過,該次比賽的第二名可不是這麼想!他認為西家的詐叫者已經嗅出電腦牌的 「味道」,因此進行詐叫。他們認為電腦牌經常是一些怪牌,分配很奇待,或是雙方 都可做成高階合約。此牌是電腦牌的典型例子,而西家在賭電腦牌的長相,並且他成 功了。   聽到橋友談起或抱怨電腦怪牌已經司空見慣,該次比賽並不是第一次。只是,該 次比賽東西南北四家都有極為巧妙的牌型配合,加上雙方在叫牌上「極度合作」,而 造就了足可喧騰一時的怪異結局。   如果將上述牌例中,南家的CA與東家C2對調,則雙方均可做成五線。這樣的牌, 大家是不是比較容易釋懷﹖如果是對調後的牌局,在雙人賽中,合約不會一面倒地由 某一方叫到。兩方叫到的比例應不會相差太過懸殊。像這樣兩方都可做成五線的牌, 用人工洗牌,是否偶而也會遇到呢﹖上述的牌,雙方有三線與七線合約。當然應該是 七線者叫到才對,而比賽時,卻由三線者叫到,當然詭異極端。因此,電腦也理所當 然成為抱怨的藉口。   國內著名的橋藝作家王禮陽先生,也對電腦發牌有所疑慮。王先生在「中國橋藝 」461 期(88年5月) 發表的「姥姥夜譚」,其中有一段敘述如後 (第38頁) :「近二 十年來,拜科技發達之賜,很多橋賽場合,喜歡採取電腦發牌。照說電腦程式輸入後 ,發出的牌局較為普遍。但是程式設計時,必須考量一些特殊牌例,因此,出現怪牌 的機會反而較為多些。不知道,國內的電腦專家們,有沒有這樣的感覺。」   為了澄清橋友們對於電腦發牌的疑慮,本文以電腦技術的角度,說明電腦如何發 牌,並藉以澄清電腦並無能力發出特殊怪異或特殊配合的牌局。高雄市橋藝中心目前 所使用的雙人賽計分程式是由筆者所撰寫,內含發牌程式。筆者進行程式設計時,並 無能力考量一些特殊牌例。如果要考量待殊牌例,必須花費更多時間設計電腦程式。   電腦發牌所需的一個核心程式為亂數產生器 (random number generator)。當你 需要一個任意的數字時,它可以幫你產生一個任意的亂數。我們可以假設亂數是不可 預測的,下一次它會產生哪個資料,我們並不知道(筆者按,從電腦亂數產生的學理 來看,若給予較詳細的電腦內部資料,亂數產生器的原始設計者會知道下一個亂數為 何,因為亂數產生器的產生公式是由該設計者給定的。)。電腦遊戲中,若需要產生 不同情境,例如踩地雷時,每次遊戲的地雷位置均為任意,就需要亂數產生器。利用 電腦進行某些事務之模擬,需要產生許多模擬實驗的資料時,亦需要亂數產生器。例 如製造飛機進行風洞實驗,若由電腦進行實驗,需要由電腦產生任意的氣流變化來考 驗飛機的應付能力。打橋牌時,需要由電腦產生不同的「任意」牌局,當然需要亂數 產生器。   亂數產生器是否真能產生「任意」數,對於各種遊戲與模擬實驗之成敗,具有舉 足輕重之影響。亂數產生器一般是由電腦程式語言的編譯器(或其程式庫)提供(編 譯器是將電腦原始程式轉換為電腦可執行檔案的一種電腦系統軟體),它並不是由一 般應用程式(例如筆者的雙人賽計分軟體就是一種應用軟體)的設計者所設計。亦即 亂數產生器是由軟體設計專家中的專家所設計,所以你大可相信電腦亂數產生器之「 任意」性。而且應用軟體的設計者並不知悉亂數產生的公式,故無法偷窺或預測下一 次即將產生的亂數。   電腦發牌的方式當然與手工發牌不同,SA 或C2在電腦中均只是一個代號,電腦 並不瞭解SA與C2的力量有分別,也不知道SA與SK有何關係。一付牌有52張,電腦首先 將各張牌對應至1至52,不同的設計者對應的方式可能不同。最簡單的方式是,SA之 編號為1,S2之編號為2,以此類推,SK為13號;接下來14至26號分別為HA、H2、.... 、HQ、HK;27至39號分別為DA 、D2、......、DQ、DK;40至52號分別為CA、C2、... ...、CQ、CK。電腦處理發牌的過程中,全以1至52來稱呼這些牌張。電腦發牌後,才 將號碼對應回到牌張,並且為了方便人們觀看牌局,才將SA與SK擺在一起(相同花色 由大而小放置)。   電腦發牌的核心工作是洗牌 (shuffle) 。剛開始,52張牌依照1、2、3、..... 、51、52的順序排列。第一步,由電腦產生一個亂數,決定1要換到何處。假設亂數 為4,則1與4對調,亦即順序變為4、2、3、 1、5、6、......、51、52。第二步,電 腦再產生一個介於2與52之間的亂數,以決定位置2的牌要換到何處。假設亂數為5, 則位置2的牌與位置5的牌對調,即順序變為4、5、3、1、2、6、......、51、 52。 第三步,電腦產生第三個亂數,其值介於3與52之間。假設亂數又為5,則位置3的牌 與位置5的牌對調,順序變為4、5、2、1、3、6、...... 、51、52。第四步,電腦產 生第四個亂數,介於4與52之間。假設亂數為39,則位置4的牌與位置39的牌對調,順 序變為4、5、2、39 、3、 6、......、38、1、40、......、51、52。第五步,電腦 產生第五個亂數,然後進行對調。以此類推,第五十二步,產生介於52與52之間的亂 數(第五十二步,對調與不對調,結果均相同)。   電腦產生52個亂數,依序經過52次對調,洗牌即大功告成。讀者可發現,亂數產 生器的確是電腦洗牌的靈魂工具。利用亂數產生器做為工具,洗牌程式不難寫出。以 下是電腦界最常使用的C語言程式的片段,為電腦洗出一付牌的程式之核心部分: for (i=1; i<=52; i++) card[i]=i; for (i=1; i<=52; i++) {  /* 產生介於i與52之間的亂數 */   j=random(52-i)+i; /* 交換兩張牌 */   temp=carde[i]   card[i]=card[j]   card[j]=temp; }   經過52次對調,將52張牌擾亂一次,可稱之為洗牌一次。若覺得洗一次牌不夠均 勻,我們亦可令電腦多洗幾次牌才發出一付牌。上述程式只是洗牌之核心部分,其前 置作業與後續動作尚需不少程式來處理。洗牌完畢,就可依序發牌給每一個賽員。將 位置1、5、9、13、..... 、49的牌張發給北家,將位置2、6、10、14、......、50 的牌張發給東家,將位置3、7、11、15、......、51的牌張發給南家,將位置4、8、 12、16、......、52的牌張發給西家。所以洗牌完畢,就已決定某張牌會落人誰家, 這與人工發牌情形相同。雖然眾多電腦發牌程式不盡相同,但其手法均與此類似。   讀者可以發現,洗牌的方式非常簡單,並未加入任何人為主觀意見在其中。若欲 「故意」發出特殊配合或分配怪異的牌局,電腦必須具備人工智慧 (artificial intelligence) 之能力,才有可能知曉牌張所代表之意義。而欲讓電腦具備此種「智 能」,與電腦發牌相比,真有天壤之別,完全不可同日而語。因此,除非有人先將電 腦打橋牌的「智能」設計好,而且故意假裝電腦沒有此種智能,否則您大可放一百個 心,電腦發牌程式是不會「做牌」的。   可是真的有人指證歷歷,說電腦牌一定長得如何如何。這些說項是絲毫沒有科學 證據的,完完全全憑藉個人感覺(直覺)。該如何取得科學證據呢﹖只能腳踏實地的 實際收集資料,再行統計分析。最好是收集一百場(甚至一千場)人工發牌的資料, 電腦亦發出相同場次的牌,然後進行統計分析,看看兩者的差異性有多大。如果真的 可以看出其間之差異,才能進一步描述說電腦牌的長相一定如何。   許多人打橋牌許多年了,可是如果問一個問題:一個人拿到十三張牌,其牌型共 有幾種可能﹖大部分的橋友可能答不出來。答案是共有 39種可能。以下是電腦發了 二千萬餘付牌,每付牌有四個人拿到手,故有八千萬餘次的牌型統計資料。 ───────────────────         出現次數  百分比(%) ─────────────────── [4,3,3,3] 8459128 10.5373% [4,4,3,2] 17297185 21.5466% [4,4,4,1] 2403577 2.9941% [5,3,3,2] 12455887 15.5160% [5,4,2,2] 8496360 10.5837% [5,4,3,1] 10381139 12.9315% [5,4,4,0] 997705 1.2428% [5,5,2,1] 2548380 3.1744% [5,5,3,0] 718811 0.8954% [6,3,2,2] 4528845 5,6415% [6,3,3,1] 2766507 3.4462% [6,4,3,0] 1065897 1.3278% [6,5,1,1] 565412 0.7043% [6,5,2,0] 521440 0.6495% [6,6,1,0] 57942 0.0722% [7,2,2,2] 412153 0.5134% [7,3,2,1] 1510674 1.8818% [7,3,3,0] 212658 0.2649% [7,4,1,1] 314413 0.3917% [7,4,2,0] 289324 0.3604% [7,5,1,0] 86574 0.1078% [7,6,0,0] 4493 0.0056% [8,2,2,1] 154055 0.1919% [8,3,1,1] 94688 0.1180% [8,3,2,0] 86859 0.1082% [8,4,1,0] 36209 0.0451% [8,5,0,0] 2495 0.0031% [9,2,1,1] 14386 0.0179% [9,2,2,0] 6605 0.0082% [9,3,1,0] 8205 0.0102% [9,4,0,0] 773 0.0010% [10,1,1,1] 330 0.0004% [10,2,1,0] 873 0.0011% [10,3,0,0] 143 0.0002% [11,1,1,0] 15 0.0000% [11,2,0,0] 7 0.0000% [12,1,0,0] 0 0.0000% [13,0,0,0] 0 0.0000% ───────────────────  合 計    80277936 100.00%   以下則為一家所持牌力以及兩家所持牌力的分佈情形。 ────────────────────       一家牌      二家牌 點力 出現次數  (%)  出現次數  (%) ──────────────────── 0 291870 0.3636 25 0.0001 1 631864 0.7871 190 0.0005 2 1089037 1.3566 829 0.0021 3 1975132 2.4604 2574 0.0064 4 3088821 3.8477 7265 0.0181 5 4162619 5.1853 17176 0.0428 6 5258111 6.5499 37468 0.0933 7 6444405 8.0276 74591 0.1858 8 7141326 8.8958 137403 0.3423 9 7511915 9.3574 235121 0.5858 10 7551388 9.4066 38334 0.9550 11 7181870 8.9463 587208 1.4629 12 6444634 8.0279 851843 2.1222 13 5550796 6.9145 1179695 2.9390 14 4572089 5.6953 155687 3.8788 15 3551289 4.4237 1965464 4.8966 16 2659254 3.3126 2369862 5.9041 17 1894415 2.3598 2742739 6.8331 18 1286320 1.6023 3038249 7.5693 19 830761 1.0349 3231563 8.0509 10 516451 0.6433 3299978 8.2214 21 304038 0.3787 3231563 8.0509 22 168355 0.2097 3038249 7.5693 23 89844 0.1119 2742739 6.8331 24 44631 0.0556 2369861 5.9041 25 21135 0.0263 1965464 4.8966 26 9354 0.0117 1556897 3.8788 27 3997 0.0050 1179694 2.9390 28 1455 0.0018 851543 2.1222 29 516 0.0006 587208 1.4629 30 188 0.0002 383334 0.9550 31 47 0.0001 235121 0.5858 32 14 0.0000 137403 0.3423 33 4 0.0000 74591 0.1858 34 1 0.0000 37468 0.0933 35 0 0.0000 17176 0.0428 36 0 0.0000 7265 0.0181 37 0 0.0000 2574 0.0064 38 0 0.0000 829 0.0021 39 0 0.0000 190 0.0005 40 0 0.0000 25 0.0001 ─────────────────── 合計 80277936 100% 40138968 100%   有心人士若願意以人工方式收集人工發牌,並加以統計,筆者所提供的這些電腦 發牌之統計資料可以作為互相比對的參考。 註:本文作者楊昌彪為中山大學資訊工程學系教授。