請選擇排列的種類,並輸入要排的個數 n。會附上算式與圖示,計算排成圓形的方法數。
這個頁面可以做什麼
- 只要輸入人數,就能算出 \(n\) 個人圍著圓桌坐的坐法(環狀排列)\((n-1)!\)
- 也能計算從 \(n\) 個中只選 \(r\) 個排成圓形的方法數 \(\dfrac{P^{n}_{r}}{r}\)
- 也能計算像項鍊那樣,把「翻面後重合的視為相同」的項鍊排列 \(\dfrac{(n-1)!}{2}\)(直接除會出錯的 \(n = 1,\ 2\) 也會正確處理)
- 「特定 2 人相鄰」「不相鄰」的坐法,也會附上把 2 人綁成一組的算式一起計算
- 答案不會四捨五入,完整顯示每一位數。位數很多時,也會附上像 \(1.23\times10^{35}\) 這樣的近似值,一眼就能掌握大小
- 可以用旋轉的圖確認「為什麼要把 \(n!\) 除以 \(n\)」。這個頁面還整理了可直接複製到 Excel、Google 試算表、Python 使用的公式
這個計算有什麼用?
圓桌就算整張轉動,「誰坐在誰旁邊」的關係也不會改變。所以座位的排法不是排成直線的 \(n!\) 種,而是環狀排列的 \((n-1)!\) 種。6 人是 120 種,8 人是 5,040 種。
座位加上「這 2 人要坐隔壁(或要分開)」的要求,數量就大不相同:6 人中讓特定 2 人坐隔壁的坐法有 48 種,不坐隔壁的有 72 種。喜宴或聚餐的主辦人煩惱「座位安排有幾種」時,就能用數字而不是感覺來掌握。
把營業所也算成 1 個停靠點,考慮經過全部 \(n\) 個地點各 1 次、繞一圈的路線。同一條路線,從哪裡出發都是同一個圈(旋轉);如果去程和回程的距離相同,反方向走距離也一樣(翻面)。所以可以區分的路線數,和項鍊排列一樣是 \(\dfrac{(n-1)!}{2}\) 種。
包含營業所共 10 個地點就有 181,440 種,15 個地點約有 \(4.36\times10^{10}\) 種。全部試一遍再選最短的並不實際,所以配送規劃軟體會用找捷徑的技巧(最佳化方法)。說明「全部檢查的方法行不通」的根據,就是這個方法數。
把 \(n\) 顆顏色或形狀不同的珠子串成一圈,設計的數量是項鍊排列的 \(\dfrac{(n-1)!}{2}\) 種。圈不論旋轉或翻面都是同一件飾品,所以要把環狀排列再除以 \(2\)。5 顆珠子是 12 種,6 顆是 60 種。
不過,如果珠子只有一面有圖案,「正反面可以區分、不能翻過來用」,就不能把翻面視為相同。這時不除以 \(2\),用環狀排列的 \((n-1)!\) 種(6 顆是 120 種)來數。光是能不能翻面使用,設計的數量就差 2 倍。
許多遊戲是沿著座位朝固定方向輪流。這種「誰的下一個是誰」的輪流順序,整圈座位轉動也不會改變,所以是環狀排列的 \((n-1)!\) 種。4 人是 6 種,5 人是 24 種。
在先手有利的遊戲中,會想連誰先開始都區分。這時把輪流順序的 \((n-1)!\) 種乘上選先手的 \(n\) 種,得到 \(n!\) 種(4 人是 24 種)。能把「只看座位順序的問題」和「也包含先手的問題」分開來數,思考公平的決定方式時就不會迷惑。
「依這個順序輪流,輪到最後再回到第一個」的值日表,從誰開始都是同一個循環,所以用環狀排列來數。5 人的值日表有 \((5-1)! = 24\) 種。
如果加上「這 2 人不要連續(相鄰)」的條件,就從全部減去 2 人相鄰的情形,得到 \((n-1)! - 2 \times (n-2)!\) 種。5 人的話是 24 − 12 = 12 種。只加 1 個條件,候選就減半,從公式可以具體看出來。
公式與圖示
符號與用語解說
符號
| \(n\) | n | 要排的全體個數。取自 number(數)的字首,常用來表示「個數」。本頁指圍著圓桌坐的人數,或串成一圈的珠子個數。 |
| \(r\) | r | 從全體 \(n\) 個中選出、實際要排的個數。像 \(P^{n}_{r}\) 這樣和 \(n\) 一起使用,意思是「從 \(n\) 個中取 \(r\) 個」。 |
| \(n!\) | n 階乘 | 階乘。\(n! = n \times (n-1) \times \cdots \times 2 \times 1\),表示 \(n\) 個全部排成一列的排法數。據說用驚嘆號表示階乘的寫法,是法國數學家克拉姆(Kramp)在 1808 年開始使用的。另外規定 \(0! = 1\)。 |
| \(P^{n}_{r}\) | P n 取 r | 排列。從 \(n\) 個中選 \(r\) 個排成一列的排法數,計算方式是 \(P^{n}_{r} = n \times (n-1) \times \cdots \times (n-r+1)\)。P 是 permutation(排列)的字首。本頁計算結果的算式寫成 \({}_{n}\mathrm{P}_{r}\)(例:\({}_{8}\mathrm{P}_{3}\)),意思相同。 |
| \(N\) | 大寫 N | 本頁用來表示環狀排列總數的字母。是 number(數)字首的大寫,常用來代表「想求的個數」。 |
| \(M\) | M | 本頁用來表示項鍊排列總數的字母。是 \(N\) 前一個英文字母,想表示和 \(N\) 不同的「另一個個數」時使用。 |
| \(A,\ B\) | A、B | 本頁用 \(A\) 表示特定 2 個相鄰的排法總數,用 \(B\) 表示不相鄰的排法總數。用前面的英文字母代表「想求的特定數」是慣例。 |
| \((n-1)!\) | n 減 1 的階乘 | 表示環狀排列總數的式子。是把 \(n\) 個排成圓形時,去掉旋轉後重合的 \(n\) 種重複所得的結果。想成「固定 1 個,排剩下的 \(n-1\) 個」也會得到相同的式子。 |
用語
| 方法數 | 滿足某個條件的做法共有幾種的數。台灣在高一的「排列組合」學到。題目問「有幾種?」時,就是在求方法數。 |
| 排列 | 把幾個東西考慮順序排起來,或指這種排法的數。排成一列的情形特別稱為直線排列,用 \(P^{n}_{r}\) 來數。 |
| 直線排列 | 排成橫的一列(直線)的一般排列。想和環狀排列區分時這樣稱呼。從左邊依序排,有頭有尾,錯開位置就變成不同的排法。 |
| 環狀排列 | 把東西排成圓形(一圈)的排法。規定旋轉後重合的排法算同 1 種,\(n\) 個就有 \((n-1)!\) 種。 |
| 項鍊排列 | 環狀排列之中,把翻面後重合的排法也算成同 1 種的排法。用來數像項鍊、手鍊這種可以翻面的圈,\(n\) 在 \(3\) 以上時有 \(\dfrac{(n-1)!}{2}\) 種。 |
| 階乘 | 從 \(1\) 到 \(n\) 的整數全部相乘的數(符號是 \(n!\))。和 \(n\) 個東西排成一列的排法數相同,\(n\) 一變大就會急遽增加(\(10! = 3{,}628{,}800\))。 |
| 旋轉後重合 | 把圈上的排法直接轉動,就和另一種排法完全相同。環狀排列不區分這樣重合的排法,算成同 1 種。轉一圈會產生 \(n\) 種重複。 |
| 翻面後重合 | 把圈翻過來(像照鏡子一樣左右顛倒)後,和另一種排法相同。項鍊排列把這種情形也算成同 1 種。 |
| 綁成一組 | 把有「一定相鄰」條件的東西用繩子綁起來,當成 1 個來處理的想法(綑綁法)。全體個數會少 1,最後再乘上組內的順序數。 |
| 餘事件 | 某個條件不發生的所有情形,寫成 \(A'\)。像「不相鄰」這種不容易直接數的條件,就從全體減去「相鄰」的情形來求。 |
| 重複計算 | 把同一個情形數了 2 次以上。環狀排列會把同一個圈的排法各數 \(n\) 次,所以最後要除以 \(n\),去掉重複。 |
| 固定一個 | 環狀排列的標準想法。先決定某 1 個人的位置,就不能再靠旋轉讓排法重合,所以就和把剩下的 \(n-1\) 個排成一列相同。 |
| 乘法原理 | 「A 的決定方式有 \(a\) 種,每一種之下 B 的決定方式各有 \(b\) 種」,全部就有 \(a \times b\) 種,這是計數的規則。把綁成一組後的環狀排列乘上順序的 \(2\),用的也是這個原理。 |
建議先了解的基礎知識
為了讓您「真正理解意義」地使用這個頁面的計算,這裡整理了建議事先理解的基礎知識。
卡住的時候,回到這裡的內容複習,是最快的捷徑。
| 方法數的基礎(高一,15~16 歲) |
|
| 排列與階乘(高一,15~16 歲) |
|
| 用除法去掉重複的想法(國小三~五年級,8~11 歲) |
|
| 圖形的旋轉與對稱(國小高年級~國中,10~15 歲) |
|
| 餘事件(高一,15~16 歲) |
|
用 Excel 計算的方法
| 要排的個數 n | 8 |
| 環狀排列總數 (n−1)! | =FACT(B1-1) |
| 全體個數 n | 8 |
| 排成圓形的個數 r | 3 |
| 排成一列的排法 nPr | =PERMUT(B1,B2) |
| 環狀排列總數 nPr÷r | =B3/B2 |
| 要排的個數 n | 5 |
| 項鍊排列總數 | =IF(B1<=2,1,FACT(B1-1)/2) |
| 要排的個數 n | 6 |
| 沒有條件的環狀排列 (n−1)! | =FACT(B1-1) |
| 2 個相鄰 2×(n−2)! | =2*FACT(B1-2) |
| 2 個不相鄰 | =B2-B3 |
FACT 是計算階乘(n!)的函數,PERMUT 是計算排列(nPr)的函數。
第 1 個表格是 8 人圍圓桌的坐法,答案是 5040。
第 2 個表格是從 8 人中選 3 人圍圓桌的坐法,nPr 是 336,除以 r 得到 112。
第 3 個表格的 IF,是為了在 n 為 2 以下時不除以 2 的分情形處理。n 輸入 5 會得到 12。
第 4 個表格是 6 人圍圓桌的例子,沒有條件為 120,相鄰為 48,不相鄰為 72。
用 Google 試算表計算的方法
| 要排的個數 n | 8 |
| 環狀排列總數 (n−1)! | =FACT(B1-1) |
| 全體個數 n | 8 |
| 排成圓形的個數 r | 3 |
| 排成一列的排法 nPr | =PERMUT(B1,B2) |
| 環狀排列總數 nPr÷r | =B3/B2 |
| 要排的個數 n | 5 |
| 項鍊排列總數 | =IF(B1<=2,1,FACT(B1-1)/2) |
| 要排的個數 n | 6 |
| 沒有條件的環狀排列 (n−1)! | =FACT(B1-1) |
| 2 個相鄰 2×(n−2)! | =2*FACT(B1-2) |
| 2 個不相鄰 | =B2-B3 |
用 Python 計算的方法
from math import factorial, perm
n = 8 # 要排的個數
r = 3 # 排成圓形的個數(從 n 個中選取時)
# 環狀排列:n 個全部排成圓形
circular = factorial(n - 1)
# 環狀排列:從 n 個中選 r 個排成圓形
circular_select = perm(n, r) // r
# 項鍊排列:翻面後重合的視為相同
# n 為 1 或 2 時,翻面後排法也不變,所以不除以 2,為 1 種
necklace = 1 if n <= 2 else factorial(n - 1) // 2
# 特定 2 個相鄰/不相鄰的環狀排列(n 為 3 以上時)
adjacent = 2 * factorial(n - 2)
not_adjacent = factorial(n - 1) - adjacent
print(f"環狀排列:{circular}")
print(f"從 {n} 個中選 {r} 個的環狀排列:{circular_select}")
print(f"項鍊排列:{necklace}")
print(f"相鄰:{adjacent} 不相鄰:{not_adjacent}")
用 LaTeX 等數學式語言的寫法(可直接複製)
N = n! ÷ n = (n−1)!
N = \frac{n!}{n} = (n-1)!
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>N</mi>
<mo>=</mo>
<mfrac>
<mrow><mi>n</mi><mo>!</mo></mrow>
<mi>n</mi>
</mfrac>
<mo>=</mo>
<mo>(</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo>)</mo><mo>!</mo>
</mrow>
</math>
N = (n!)/n = (n-1)!
N = (n - 1)!
N := (n-1)!;
N = factorial(n-1);
N = n!/n = (n-1)!
N = Pⁿᵣ ÷ r
N = \frac{P^{n}_{r}}{r}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>N</mi>
<mo>=</mo>
<mfrac>
<mrow><msubsup><mi>P</mi><mi>r</mi><mi>n</mi></msubsup></mrow>
<mi>r</mi>
</mfrac>
</mrow>
</math>
N = (P_r^n)/r
N = (n!/(n - r)!)/r
N := numbperm(n, r)/r;
N = nchoosek(n,r)*factorial(r)/r;
N = P_r^n/r
M = (n−1)! ÷ 2
M = \frac{(n-1)!}{2}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>M</mi>
<mo>=</mo>
<mfrac>
<mrow><mo>(</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo>)</mo><mo>!</mo></mrow>
<mn>2</mn>
</mfrac>
</mrow>
</math>
M = ((n-1)!)/2
M = (n - 1)!/2
M := (n-1)!/2;
M = factorial(n-1)/2;
M = (n-1)!/2
A = 2 × (n−2)!
A = 2 \times (n-2)!
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>A</mi>
<mo>=</mo>
<mn>2</mn>
<mo>×</mo>
<mo>(</mo><mi>n</mi><mo>−</mo><mn>2</mn><mo>)</mo><mo>!</mo>
</mrow>
</math>
A = 2 * (n-2)!
A = 2 (n - 2)!
A := 2*(n-2)!;
A = 2*factorial(n-2);
A = 2(n-2)!
B = (n−1)! − 2 × (n−2)!
B = (n-1)! - 2 \times (n-2)!
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>B</mi>
<mo>=</mo>
<mo>(</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo>)</mo><mo>!</mo>
<mo>−</mo>
<mn>2</mn>
<mo>×</mo>
<mo>(</mo><mi>n</mi><mo>−</mo><mn>2</mn><mo>)</mo><mo>!</mo>
</mrow>
</math>
B = (n-1)! - 2 * (n-2)!
B = (n - 1)! - 2 (n - 2)!
B := (n-1)! - 2*(n-2)!;
B = factorial(n-1) - 2*factorial(n-2);
B = (n-1)! - 2(n-2)!
請 ChatGPT 幫忙計算的方法
你是數學(方法數)的計算助理。請務必實際執行 Python 程式碼來進行下列計算,並只以執行結果的數值作為回答的依據(請不要用心算或猜測回答)。 關於 8 個人圍著圓桌坐的坐法,請求出下列 4 項。 1. 8 人全部的環狀排列(旋轉後重合的坐法算同 1 種) 2. 從 8 人中選 3 人,坐在 3 人座圓桌的坐法 3. 8 顆珠子串成一圈的項鍊排列(旋轉或翻面後相同的算 1 種) 4. 8 人的圓桌中,特定 2 人相鄰的坐法與不相鄰的坐法 請在 Python 中使用標準函式庫的 math 模組(factorial、perm)精確計算,並列出使用的公式和執行結果的數值。同時也請說明每個公式為什麼是這個形式。
使用方法
-
1輸入數值在輸入欄中輸入要計算的數值
-
2計算按下「計算」按鈕
-
3查看結果計算結果會立即顯示。計算的思路和公式的解說,也都能在同一個頁面查看
DataChef 的特色
不需專業知識,操作直覺又簡單
無須登錄任何個人資料
按下「下載」後自動刪除檔案
無須標註來源出處
亦無須事先取得商用授權