Python で順列と組み合わせを実装してみる

数学

順列は簡単に言うと「並べ方、並べる順番」です。

つまり、n個の異なった要素から決められた数、rの要素を取り出し、取り出した順番に並べた数が順列です。

ちょっと何言っているかわからないですよね。

もっと簡単に言うと、例えば1,2,3,4,5,6,7,8,9,10と書かれた6枚のカードからランダムに6枚を引いて並べた時の並べ方は何通りあるかという意味ですね。

プログラミング無料体験はこちら↓↓↓


Sponsored Link

順列を計算してみる

考え方としては、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通りになります。

プログラミング無料体験はこちら↓↓↓


 

Sponsored Link

コメント

タイトルとURLをコピーしました