【プログラミング問題】百人一首問題

概要

国語の試験でこんな問題があったとします。

百人一首について、次の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問ぐらい合うやろ・・・なんで全部外すねん・・・」

ということで求めたら意外と確率は高かった。残念。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です