順列は簡単に言うと「並べ方、並べる順番」です。
つまり、n個の異なった要素から決められた数、rの要素を取り出し、取り出した順番に並べた数が順列です。
ちょっと何言っているかわからないですよね。
もっと簡単に言うと、例えば1,2,3,4,5,6,7,8,9,10と書かれた6枚のカードからランダムに6枚を引いて並べた時の並べ方は何通りあるかという意味ですね。
順列を計算してみる
考え方としては、6枚のカードの場合1枚目は6通りの選び方があり、2枚目は5通り、3枚目は4通りで、4枚目は3通り、5枚目は….ですね。
つまり1枚目は n 通り、2枚目は n-1 通り、3枚目は n-2 通りと続きますが、最後の6枚目の選び方は n – (r – 1) 通り、つまり 10 – (6 – 1) = 5 なので5通りになるのです。
そして並べ方の総数は r 個の選び方の積で となり、カードの例では
= 10 x 9 x 8 x 7 x 6 x 5 = 151200 通りになります。
を公式で表してみると、
または
=
いきなりビックリマークが出てきましたが、これは階乗の意味で、例えば
5! = 5 x 4 x 3 x 2 x 1
となります。
Pythonを使った順列の練習問題
では5の階乗、つまり 5! を計算してみましょう。
といっても、mathモジュールからファクトリアルを使うだけ。
import math
print(math.factorial(5))
120
実装した結果は 120 ですね。
次に 3の階乗かける3の階乗 3! x 3! を実装してみましょう。
これもfactorialを使って実装すると、
print(math.factorial(3)*math.factorial(3))
36
36になります。
割り算も同じ要領で計算します。
5! / 3! 5の階乗割る3の階乗を実装すると、
print(math.factorial(5)/math.factorial(3))
20.0
という結果になりました。
順列の数の計算
次に順列の数を計算してみましょう。
つまり、8個の要素のから3個を任意で取り出した時の並べ方は、何通りあるかという問題です。
手計算でいいのですが、ライブラリの pcipyを使うと簡単に計算できますね。
from scipy.special import perm
perm(8, 3, exact=True)
336
実装すると、336になります。
以下の場合も同じくscipyで計算できます。
「12人の出場者の中で1位から3位までを決めるときその結果は何通りか?」
これを順列の式に当てはめると、 となるので実装すると、
from scipy.special import perm
perm(12, 3, exact = True)
1320
1320通りの結果があることがわかります。
組み合わせ
では組み合わせは何通りあるかを、Pythonで実装してみます。
これもscipy から combモジュールをインポートすることで簡単に求められます。
8個の要素から3個の要素を選んだ時の組み合わせ、つまり は何通りあるかを実装します。
from scipy.special import comb comb(8, 3, exact=True) 56
つまり、56通りの組み合わせがあるということになります。
そして「20人の中から3人のアルバイトを選ぶ選びかたは何通りあるか?」という問いに対しても同じように、
comb(20, 3, exact=True)
1140
つまり1140通りの組み合わせがあるということになります。
では応用編として、以下の問題を解いてみます。
「赤い球が6個、黄色い球が4個入っている箱から無作為に5個を取り出し、赤い球が4個、黄色い球が1個入っている組み合わせは何通りかを数える。」
print(comb(6, 4, exact=True)*comb(4, 1, exact=True))
60
実装すると、60通りになります。
コメント