概要
国語の試験でこんな問題があったとします。
百人一首について、次の10個の上の句について、正しい下の句を選び、記号で答えよ。
(10個の上の句と、10個の選択肢が並ぶ)
これを適当に答えて、10問全部外す確率を求めよ。
・・・というのを数学的に考えて答えを出すのは、意外と大変です。
なので、プログラムを組んで「実際に全事象の中から全問外す事象を全て数え上げよ」というのが問題。
言語は何でもいいです。僕はPythonを使いました。
ちょっとチャレンジしてみようと思う人のために、解答は下の方に書きます。スクロールしてみてください。
解答
実際の国語の問題はア~コから選べみたいな感じだと思うんですが、Pythonで扱いやすくするために、1~10の数字の順列を全パターン作って、以下のように調べました。

全ての順列に対して
- n番目がnかどうか
をチェックして、引っかかったらループ抜け。無事最後までチェックをスルーすることができたらgood_sample
にカウントを1つ追加、という感じでやりました。
以下コード。
import itertools import numpy as np a = np.array(list(itertools.permutations(range(10)))) # 10個の順列の全てのパターンを生成 total = a.shape[0] # -> 3628800 column = a.shape[1] # -> 10 good_sample = 0 for i in range(total): # 順列を一つ取り出す b = a[i] flg = True # n番目がnかどうかチェック for j in range(column): if b[j] == j: flg = False break # もしチェックに引っかからなければ if flg: good_sample += 1 print(str(good_sample) + "/" + str(total)) print(str(good_sample/total))
出力は以下の通り。
1334961/3628800
0.3678794642857143
ということで約36.8%
元々は国語の先生のぼやきから
「10問あったら適当に答えても1問ぐらい合うやろ・・・なんで全部外すねん・・・」
ということで求めたら意外と確率は高かった。残念。