樂透

樂透機率怎麼算?組合數 C(n,k) 白話推導,三行 Python 算出每個獎項

我在彩券行聽過最多次的一句話是「大樂透機率 1,398 萬分之一」,但問到為什麼是這個數字,沒人答得出來。這個數字其實只是一道國中排列組合題,而且學會算它之後,威力彩、539、包牌、對中三碼的機率全部用同一招就能算。這篇不講任何「技巧」,只講怎麼算,還有我自己算錯過的四個地方。

:::tip TL;DR

  • 樂透的機率全部來自一個公式:C(n,k)=n!/(k!(n−k)!),意思是「n 個裡選 k 個、不管順序、不重複」有幾種選法。
  • C(49,6)=13,983,816、C(38,6)×8=22,085,448、C(39,5)=575,757,三個分母算一次就記住了。
  • 對中 k 碼的機率 = C(獎號數,k)×C(非獎號數,剩下碼數) ÷ 總組合數;Python 的 math.comb 三行搞定。 :::

組合數 C(n,k) 到底在數什麼:用排隊想

想像 49 顆球排成一排讓你挑 6 顆。第一顆有 49 種選法,第二顆剩 48 種,依此類推,六顆挑完是 49×48×47×46×45×44 = 10,068,347,520 種「有順序的」挑法。

但樂透不管順序。「3、17、25、31、40、48」跟「48、40、31、25、17、3」是同一注。6 顆球的排列順序有 6×5×4×3×2×1 = 720 種,所以每一組號碼在上面那個數字裡被重複算了 720 次。除回去:10,068,347,520 ÷ 720 = 13,983,816。

這就是 C(49,6),念作「49 取 6」。一般寫法是:

C(n, k) = n! / (k! × (n−k)!)
C(49, 6) = 49! / (6! × 43!) = 13,983,816

同樣的招式:今彩539 是 39×38×37×36×35 ÷ 120 = 69,090,840 ÷ 120 = 575,757。威力彩第一區 38×37×36×35×34×33 ÷ 720 = 1,987,690,320 ÷ 720 = 2,760,681,再乘第二區 8 種可能,22,085,448。

:::david 我國中的時候背 C(n,k) 公式背得很痛苦,直到有次寫程式需要算組合,才用「先算有順序的、再除掉重複的順序」這個想法重新理解它,從此沒再忘過。這也是為什麼我每次講機率都從「排隊」講,不從公式講。公式是結果,排隊才是原因。 :::

為什麼威力彩要相乘,不是 46 選 7

這是我看過最多人搞錯的地方。威力彩第一區 01~38、第二區 01~08,有人直覺把它當成「46 個號碼選 7 個」。錯在兩個地方:

  1. 第二區的號碼跟第一區是不同的球。第一區開出 05、第二區也可以開出 05。
  2. 第二區只選 1 個,跟第一區選 6 個是兩個獨立的動作。

兩個獨立事件同時發生,機率相乘,組合數也相乘:2,760,681 × 8 = 22,085,448。官網寫「頭獎中獎率約 1/2,209 萬」就是這個數字。

同樣的邏輯可以反過來用:如果你第二區全包 8 個號碼,第二區一定對中,剩下就是第一區 1/2,760,681。這也是為什麼 第二區全包 剛好是 8 倍機率。

對中 k 碼的機率:把 49 個號碼分成三堆

頭獎只是「全中」,真正好玩的是中 3 碼、4 碼、5 碼的機率。方法是把號碼分堆。開獎後,49 個號碼變成三堆:6 個獎號、1 個特別號、42 個什麼都不是的號碼。

你的 6 個選號要「剛好對中 3 個獎號、沒碰到特別號」,就是從 6 個獎號裡選 3 個 且 從 42 個普通號碼裡選 3 個:

C(6,3) × C(42,3) = 20 × 11,480 = 229,600
機率 = 229,600 / 13,983,816 = 1/60.9

大樂透的八個獎項全部是這個模式,差別只在特別號有沒有算進去:

獎項 獎號堆選幾個 特別號 普通號堆選幾個 組合數
頭獎 6 - 0 C(6,6)=1
貳獎 5 要 0 C(6,5)×1=6
參獎 5 不要 1(從 42 個) C(6,5)×42=252
肆獎 4 要 1 C(6,4)×42=630
伍獎 4 不要 2 C(6,4)×C(42,2)=12,915
陸獎 3 要 2 C(6,3)×C(42,2)=17,220
柒獎 2 要 3 C(6,2)×C(42,3)=172,200
普獎 3 不要 3 C(6,3)×C(42,3)=229,600

八個加起來 432,824,13,983,816 ÷ 432,824 = 32.3,剛好是官網的「總中獎率約 1/32」。這個對帳步驟很重要,它能抓到你分堆分錯的地方。

順便檢查一下三堆的號碼數有沒有加對:每一列「獎號堆選幾個+特別號(0 或 1)+普通號堆選幾個」都要等於 6,因為你一注就是 6 個號碼。參獎那列是 5+0+1、柒獎是 2+1+3,都是 6。只要有一列加起來不是 6,那列的算式一定錯。這個檢查比對官網數字更快,我現在算新彩種的時候都先做這一步。

今彩539 更單純,沒有特別號,只有兩堆:5 個獎號、34 個普通號。中 2 碼就是 C(5,2)×C(34,3)=10×5,984=59,840,機率 1/9.6。威力彩要多乘一個第二區的因子:中就 ×1、不中就 ×7。完整表格在三篇玩法文裡。

三行 Python 算出所有獎項

Python 3.8 以後內建 math.comb,不用自己寫階乘:

from math import comb

total = comb(49, 6)                               # 13,983,816
for k in range(3, 7):                             # 對中 3~6 碼
    n = comb(6, k) * comb(43, 6 - k)              # 先不分特別號
    print(f"中 {k} 碼:{n:>9,} 種,機率 1/{total/n:,.1f}")

跑出來:中 3 碼 246,820 種(1/56.7)、中 4 碼 13,545 種(1/1,032)、中 5 碼 258 種(1/54,201)、中 6 碼 1 種。這個版本把特別號混在 43 個非獎號裡,所以「中 3 碼」是陸獎+普獎合計、「中 5 碼」是貳獎+參獎合計。要拆開特別號就把 comb(43, 6-k) 換成 comb(42, 6-k)(不含特別號)跟 comb(42, 5-k)(含特別號),兩行就夠。

威力彩版本只多一個乘數:

z1, z2 = comb(38, 6), 8
for k in range(1, 7):
    n = comb(6, k) * comb(32, 6 - k)
    print(k, f"二區中 1/{z1*z2/n:,.1f}", f"二區不中 1/{z1*z2/(n*7):,.1f}")

:::david 我第一次寫這段程式時,中 3 碼算出 1/56.7,跟官網的普獎 1/60.9 對不上,以為官網錯了。盯了十分鐘才想到我沒拆特別號:1/56.7 是「陸獎+普獎」加起來的機率,拆開後 1/812 + 1/60.9 剛好等於 1/56.7。從那次之後,我算任何樂透機率都會先用官網給的總中獎率對一次帳,對不上就一定是我分堆分錯。 :::

四個最常算錯的地方

一、忘記特別號是獨立的一堆。 算參獎用 C(6,5)×43 會多算 6 種,那 6 種是貳獎。大樂透任何「不含特別號」的獎項,普通號堆都是 42 不是 43。

二、把威力彩兩區合併。 上面講過了,46 選 7 是錯的,正解是 C(38,6)×8。

三、把注數直接當成機率倍數,但號碼有重複。 買 28 注不同組合,頭獎機率是 28/13,983,816 沒錯;但如果你 28 注裡有兩注號碼一樣,機率就只有 27 份。包牌(系統組合)保證不重複,自己手寫 28 張就不一定。

四、把「總中獎率」當成「每注回收率」。 大樂透總中獎率 1/32,意思是平均 32 注會中一次「任何獎」,而那個獎 92% 的機會是 400 元。它跟「拿回多少錢」是兩回事,後者要用 期望值 算。

還有一個不算錯、但常被誤用的:每期獨立。C(49,6) 算的是這一期的機率,跟上一期開了什麼、某個號碼幾期沒開完全無關。遺漏值、冷熱號可以描述過去,不能改變 13,983,816 這個分母。想看回測數據的話在 冷熱號有用嗎。

常見問題

大樂透 13,983,816 這個數字怎麼算出來的? 49 個號碼選 6 個不管順序的組合數 C(49,6)=49×48×47×46×45×44 ÷ (6×5×4×3×2×1)=10,068,347,520 ÷ 720=13,983,816。分子是有順序的排法,除以 6! 把順序消掉。

為什麼威力彩是 22,085,448 而不是 C(39,7) 之類的? 威力彩兩區是分開抽的:第一區 C(38,6)=2,760,681 種,第二區 8 種,獨立事件相乘得 22,085,448。第二區的號碼可以跟第一區重複(都有 01~08),所以不能合成一個 46 選 7。

中三個號碼的機率怎麼算? 以大樂透為例,49 個號碼裡 6 個是獎號、42 個不是(扣掉特別號)。對中剛好 3 碼的組合數是 C(6,3)×C(42,3)=20×11,480=229,600,除以 13,983,816 得 1/60.9。

買 10 注機率是不是 10 倍? 10 注不同號碼,頭獎機率是 10/13,983,816,確實 10 倍,因為每注對應不同的組合。但 10 注同樣號碼機率不會變,只是中了領 10 份。注數乘機率的前提是號碼組合不重複。

用 Python 怎麼算樂透機率? from math import comb,然後 comb(49,6) 就是總組合數;對中 k 碼的組合數是 comb(6,k)*comb(42,6-k)。三行就能印出所有獎項,文章裡有完整程式碼。

延伸閱讀