「9人を2人・3人・4人の班に分けたい。分け方は全部で何通りあるんだろう?」
研修の班分けやシフトの割り当てで、こんな疑問が浮かぶことがありますよね。電卓で階乗を掛けたり割ったりするのは手間がかかり、桁の打ち間違いも起きがちです。
GoogleスプレッドシートのMULTINOMIAL関数なら、各班の人数を並べるだけで答えが出ます。この記事では9人の班分けを1つの例にして、結果の数字の意味からFACT・COMBINでの検算まで順に見ていきましょう。
スプレッドシートのMULTINOMIAL関数とは?「班分けの分け方の数」を出す関数
結論:9人を2・3・4人の班に分けると1260通り
先に答えから見てみましょう。9人をA班2人・B班3人・C班4人に分ける方法は、次の1式で求められます。
=MULTINOMIAL(2, 3, 4)
結果は「1260」です。誰をどの班に入れるかのパターンが、全部で1,260通りあるという意味になります。
定義式と構文
MULTINOMIAL関数の読み方は「マルチノミアル」。英語で「多項の」という意味で、数学では「多項係数」と呼ばれる値を返します。
Googleの公式ヘルプでは「値の合計の階乗を、各値の階乗の積で割った結果」と説明されています。階乗とは、1からその数までを全部掛けた値のこと。たとえば4の階乗(4!)は1×2×3×4=24です。
先ほどの例を定義式に当てはめると、こうなります。
(2+3+4)! ÷ (2! × 3! × 4!)
= 362880 ÷ (2 × 6 × 24)
= 362880 ÷ 288
= 1260
階乗そのものを求める関数はFACT関数です。MULTINOMIAL関数は、この割り算を1つにまとめてくれる関数だと考えると分かりやすいでしょう。
構文と引数は次のとおりです。
=MULTINOMIAL(値1, [値2, ...])
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 値1 | 必須 | 1つ目の班の人数。数値またはセル範囲を指定 |
| 値2, … | 任意 | 2つ目以降の班の人数。数値またはセル範囲を指定 |
基本の使い方:数字を並べる・セルを参照する・範囲で渡す
直書きとセル参照
いちばん簡単なのは、人数をカンマ区切りで直接書く方法です。5人を2人と3人に分けるなら、次のように入力します。
=MULTINOMIAL(2, 3)
結果は「10」です。ただ、人数を変えるたびに数式を直すのは面倒ですよね。実務では、人数をセルに入れておくほうが便利です。
次のような表を用意してみてください。
| A | B | |
|---|---|---|
| 1 | 班 | 人数 |
| 2 | A班 | 2 |
| 3 | B班 | 3 |
| 4 | C班 | 4 |
この表なら、セルを1つずつ指定して =MULTINOMIAL(B2, B3, B4) と書けます。結果は「1260」。B列の人数を書き換えれば、答えも自動で更新されます。
範囲指定 =MULTINOMIAL(B2:B4)
セルを1つずつ並べなくても、範囲でまとめて渡せるのが便利なところ。公式ヘルプにも MULTINOMIAL(A2:A9) という範囲指定の例が載っています。
=MULTINOMIAL(B2:B4)
結果は同じく「1260」です。班が増えたら、表に行を足して範囲を広げるだけで済みます。
ただし、範囲内に「3人」のような文字が混じると #VALUE! になります(文字は無視されません)。範囲内の0は結果に影響せず、=MULTINOMIAL(A7:A8,4)(A7=3、A8=0)は35になります。人数の列には数値だけを入れておきましょう。
複数のパターンを行ごとに計算したいときは、1行に1つずつ数式を置いてコピーするのが確実です。=ARRAYFORMULA(MULTINOMIAL(D1:D2,E1:E2)) のように包んでも、行ごとの結果にはなりません。範囲の数値をすべてまとめた1つの値(この例なら =MULTINOMIAL(2,3,3,3) の92400)が返るだけで、スピルもしません。
引数1つ・0を含む場合
引数が1つだけのときは、定義式どおりに計算すると「5! ÷ 5! = 1」になります。分ける先が1つしかないので、分け方も1通りというわけです。
=MULTINOMIAL(5)
=MULTINOMIAL(3, 0, 4)
0を含む2つ目の式は、計算上「35」になります。0の階乗は1なので、0人の班は答えに影響しません。結果は =MULTINOMIAL(3, 4) と同じです。
FACT・COMBINで手計算すると?同じ答えになる検算
3通りの式を並べた検算表
「1260って本当に合っているの?」と気になる人もいるはず。そこで、同じ9人の班分けを3つの方法で計算し、答えをそろえてみます。
| 計算方法 | 数式 | 途中の値 | 結果 |
|---|---|---|---|
| MULTINOMIAL | =MULTINOMIAL(2,3,4) | — | 1260 |
| FACT | =FACT(9)/(FACT(2)FACT(3)FACT(4)) | 362880÷288 | 1260 |
| COMBIN | =COMBIN(9,2)COMBIN(7,3)COMBIN(4,4) | 36×35×1 | 1260 |
COMBINの式は、人を順に選んでいく考え方です。まず9人からA班の2人を選ぶと36通り。残り7人からB班の3人を選ぶと35通りです。
最後に残った4人は、自動的にC班に決まります(1通り)。これらを掛け合わせると36×35×1=1260で、MULTINOMIALと一致します。
シートで試すなら、3つのセルに次の式を入れて見比べてみてください。
=MULTINOMIAL(2, 3, 4)
=FACT(9)/(FACT(2)*FACT(3)*FACT(4))
=COMBIN(9,2)*COMBIN(7,3)*COMBIN(4,4)
FACTの分母は PRODUCT(FACT(2),FACT(3),FACT(4)) と書くこともできます。掛け算の関数はPRODUCT関数で詳しく紹介しています。
班に区別がある・ない(6人→3人×2班:20通りと10通り)
ここが一番間違えやすいポイントです。MULTINOMIAL関数が数えるのは「A班・B班のように、班に名前がある場合」の分け方になります。
6人を3人ずつの2班に分けてみましょう。
=MULTINOMIAL(3, 3)
=MULTINOMIAL(3, 3)/FACT(2)
1つ目の答えは「20」です。ところが班に名前がなく、単に「2つのグループ」に分けるだけなら事情が変わります。
たとえば「太郎・花子・健太の組」と「残り3人の組」は、どちらをA班と呼んでも同じ分け方ですよね。班に名前がなければ、この入れ替えが2通りずつ重なっています。そこで、2つ目の式のように2!で割ると「10」になります。
ルールは、同じ人数の班がk個あり、それを区別しないならFACT(k)で割るです。9人を2・3・4人に分ける例は人数がすべて違うため、割る必要はありません。
COMBINとの使い分け・PERMUT系は順序ありの別物
2班に分けるだけなら、COMBIN関数でも同じ答えになります。たとえば =MULTINOMIAL(3, 7) と =COMBIN(10, 3) は、どちらも「120」です。
3班以上になると、COMBINでは掛け算を重ねる必要があります。人数を並べるだけで済むMULTINOMIALのほうが、式は短く読みやすいでしょう。
なお、PERMUT関数やPERMUTATIONA関数は「順番を区別する並べ方」を数える関数です。班の中の並び順を問わない班分けとは別物なので、混同に注意しましょう。
名前の似たFACTDOUBLE関数は、1つおきに掛ける「二重階乗」を返します。こちらも計算内容はまったく異なります。
使いどころ:班分け・シフト割り当て・同じ文字を含む並べ替え
班分け・割り当て
10人をA・B・Cの3チームに、3人・3人・4人で分けるとします。この場合は =MULTINOMIAL(3, 3, 4) で「4200」通りです。チームに名前があるので、割り算は要りません。
シフトの割り当てにも使えます。12人を早番・中番・遅番に4人ずつ振り分けると、=MULTINOMIAL(4, 4, 4) で「34650」通り。早番と遅番は入れ替えると別の割り当てになるので、こちらもそのままの値で数えます。
同じ文字を含む並べ替え(AABなど)
意外な使い道が、同じ文字を含む文字列の並べ替えです。「AAB」を並べ替えると、AAB・ABA・BAAの3通りになります。
=MULTINOMIAL(2, 1)
Aが2個、Bが1個なので、引数は2と1です。結果は「3」で、書き出した数と一致します。
長い単語でも考え方は同じ。「MISSISSIPPI」はM1個・I4個・S4個・P2個です。=MULTINOMIAL(1, 4, 4, 2) で「34650」通りになります。
11文字がすべて違えば11!=39,916,800通りなので、同じ文字の重複でぐっと減ることが分かります。
多項分布の確率
サイコロを6回振って、1が2回・2が1回・3が3回出る確率も計算できます。出る順番のパターン数をMULTINOMIALで求め、1回ごとの確率を掛けるのがコツです。
=MULTINOMIAL(2, 1, 3)*(1/6)^6
パターン数は「60」、全体の出方は6の6乗で46,656通りです。結果は60÷46656で約0.001286。つまり約0.13%しかありません。
目ごとに確率が違う場合は、B2:B4に回数、C2:C4に確率を入れておきましょう。そのうえで次の式を入れれば、セルの値を変えるだけで再計算できます。
=MULTINOMIAL(B2:B4)*C2^B2*C3^B3*C4^B4
スプレッドシートのMULTINOMIAL関数のエラーと注意点・Excel版との違い・まとめ
エラーになりやすい入力と対処
人数として不自然な値を渡すと、エラーや想定外の結果につながります。次の表は、スプレッドシートで実際に試した結果です。
| 入力の例 | 結果 | 対処 |
|---|---|---|
負の数(=MULTINOMIAL(-1,3)) | #NUM! | 0以上の人数を入れる |
文字の直書き(=MULTINOMIAL("a",3)) | #VALUE! | 数値だけを入れる |
数字の文字列(=MULTINOMIAL("2",3)) | 10(数値として扱われる) | 数値で入れておくほうが安全 |
| 範囲・セル参照内の文字 | #VALUE!(無視されない) | 人数の列は数値だけにする |
空白セル1つだけを参照(=MULTINOMIAL(A6)) | 1 | 参照先がずれていないか確認する |
小数(=MULTINOMIAL(2.7,3)) | 10(2.7は2として扱われる。切り捨て) | ROUNDやINTで整数にしてから渡す |
TRUE(=MULTINOMIAL(TRUE,3)) | 4(TRUEは1として扱われる) | 論理値は渡さない |
合計がとても大きい(=MULTINOMIAL(100,71)、合計171) | 約1.56355E+49(エラーにならない) | 指数表記になるので桁に注意 |
特に注意したいのが小数です。小数は四捨五入ではなく切り捨てられるため、2.7人は2人として計算されます。人数を別の計算から持ってくると端数が残ることがあるので、次のように整数にそろえてから渡せば、結果を読み違えずに済むでしょう。
=MULTINOMIAL(ROUND(B2,0), ROUND(B3,0))
Excel版との違い
関数名と計算の考え方は、Excelでも共通です。Excelの公式ヘルプでは、引数は1〜255個と書かれています。非数値は #VALUE!、0未満の値は #NUM! になるとも明記されています。
スプレッドシート版のヘルプにはエラーの種類が載っていませんが、実際に試すと負の数は #NUM!、文字は #VALUE! になりました。この点はExcelと同じです。一方、小数は切り捨てて計算され、TRUEは1として扱われます。Excelで使う場合は、ExcelのMULTINOMIAL関数の使い方にまとめています。
よくある質問
Q. 結果が「1」になってしまうのはなぜ?
引数が1つしか渡っていない可能性があります。範囲の指定がずれて、1つのセルだけを参照していないか確認してみてください。
Q. FACTで計算した値と合いません。
分子の階乗が「人数の合計」になっているかを見直しましょう。9人の例なら、分子は FACT(9) です。分母の階乗の個数が、班の数とそろっているかもチェックしてください。
Q. 班に名前がない場合は?
同じ人数の班の数だけ階乗で割ります。3人×2班なら =MULTINOMIAL(3, 3)/FACT(2) で10通りです。
まとめ
- MULTINOMIAL関数は「合計の階乗 ÷ 各値の階乗の積」を返し、班分けの数を1式で出せる
- 9人を2・3・4人に分けると1260通りで、FACT・COMBINの検算とも一致する
- 人数はセル範囲でも渡せる(
=MULTINOMIAL(B2:B4)) - 同じ人数の班を区別しないなら、その班の数の階乗で割る
- 2班ならCOMBINと同じ結果になり、3班以上ならMULTINOMIALが便利
まずは =MULTINOMIAL(2, 3, 4) を入力して、1260が返ることを確かめてみてください。そのあとFACTとCOMBINの式を横に並べると、数字の意味がすっと腹落ちするはずです。

