Pythonでランダムな問題集と解答集を自動生成する

この記事では、Pythonのrandomモジュールやファイル操作の知識を組み合わせて、問題と選択肢が毎回ランダムな順序で出題される、複数パターンの問題集とそれに対応する解答集を自動で生成するスクリプトの作成方法を解説します。


目次

1. 準備:問題データの定義とモジュールのインポート

はじめに、クイズの元となるデータを定義します。ここでは、国の名前をキー、その首都をとする辞書を作成します。また、必要なモジュールとしてrandompathlibをインポートします。

import random
from pathlib import Path

# 問題のデータ(国名: 首都)
country_capitals = {
    '日本': '東京', 'アメリカ': 'ワシントンD.C.', 'イギリス': 'ロンドン',
    'フランス': 'パリ', 'ドイツ': 'ベルリン', 'イタリア': 'ローマ',
    '中国': '北京', 'インド': 'ニューデリー', 'ロシア': 'モスクワ',
    'ブラジル': 'ブラジリア', 'カナダ': 'オタワ', 'オーストラリア': 'キャンベラ',
    # ... さらに多くの国と首都を追加可能
}

2. クイズと解答ファイルの生成ループ

次に、指定した数だけ問題集と解答集のペアを作成するためのメインループを構築します。ここでは5種類の問題集を作成します。生成したファイルは、quizzesという名前のフォルダに保存します。

# quizzesフォルダがなければ作成
output_dir = Path('quizzes')
output_dir.mkdir(exist_ok=True)

# 5種類の問題集を作成
for quiz_num in range(5):
    # ファイル名を設定
    quiz_file_path = output_dir / f'quiz_{quiz_num + 1}.txt'
    answer_file_path = output_dir / f'quiz_answers_{quiz_num + 1}.txt'
    
    # with文でファイルを安全に開く
    with open(quiz_file_path, 'w', encoding='utf-8') as quiz_file, \
         open(answer_file_path, 'w', encoding='utf-8') as answer_key_file:
        
        # 問題集のヘッダーを書き込む
        quiz_file.write('名前:\n\n日付:\n\n学籍番号:\n\n')
        quiz_file.write(f'{" " * 20}国と首都クイズ (問題番号 {quiz_num + 1})\n\n')
        
        # (この後、問題作成と書き込み処理が続く)

3. 問題のシャッフルと選択肢の作成

各問題集で出題順序が異なるように、国名のリストをシャッフルします。その後、各問題に対して、正解1つと不正解3つの選択肢をランダムに作成します。

        # 国名のリストを取得し、ランダムに並び替える
        countries = list(country_capitals.keys())
        random.shuffle(countries)

        # 各国について問題を作成
        for question_num, country in enumerate(countries):
            correct_answer = country_capitals[country]
            
            # 不正解の選択肢を作成
            all_capitals = list(country_capitals.values())
            wrong_answers = all_capitals[:] # 全首都リストをコピー
            wrong_answers.remove(correct_answer) # 正解を削除
            wrong_answers = random.sample(wrong_answers, 3) # 不正解を3つランダムに選ぶ
            
            # 正解と不正解を結合し、選択肢全体をシャッフル
            answer_options = wrong_answers + [correct_answer]
            random.shuffle(answer_options)
            
            # (この後、ファイルへの書き込み処理が続く)

4. ファイルへの書き込み

最後に、作成した問題と選択肢、そして解答をそれぞれのファイルに書き込みます。

            # 問題文と選択肢を問題集ファイルに書き込む
            quiz_file.write(f'{question_num + 1}. {country}の首都はどこですか?\n')
            for i in range(4):
                quiz_file.write(f"    {'ABCD'[i]}. {answer_options[i]}\n")
            quiz_file.write('\n')

            # 解答を解答集ファイルに書き込む
            correct_answer_index = answer_options.index(correct_answer)
            answer_key_file.write(f"{question_num + 1}. {'ABCD'[correct_answer_index]}\n")

5. 完成したコード全体

以下に、これまでのステップをすべて統合した完全なスクリプトを示します。

import random
from pathlib import Path

# 1. 問題データ
country_capitals = {
    '日本': '東京', 'アメリカ': 'ワシントンD.C.', 'イギリス': 'ロンドン',
    'フランス': 'パリ', 'ドイツ': 'ベルリン', 'イタリア': 'ローマ', '中国': '北京',
    'インド': 'ニューデリー', 'ロシア': 'モスクワ', 'ブラジル': 'ブラジリア',
    'カナダ': 'オタワ', 'オーストラリア': 'キャンベラ', 'エジプト': 'カイロ'
}

# 2. メインループ
output_dir = Path('quizzes')
output_dir.mkdir(exist_ok=True)

for quiz_num in range(5):
    quiz_file_path = output_dir / f'quiz_{quiz_num + 1}.txt'
    answer_file_path = output_dir / f'quiz_answers_{quiz_num + 1}.txt'
    
    with open(quiz_file_path, 'w', encoding='utf-8') as quiz_file, \
         open(answer_file_path, 'w', encoding='utf-8') as answer_key_file:
        
        quiz_file.write('名前:\n\n日付:\n\n学籍番号:\n\n')
        quiz_file.write(f'{" " * 20}国と首都クイズ (問題番号 {quiz_num + 1})\n\n')
        
        # 3. 問題のシャッフル
        countries = list(country_capitals.keys())
        random.shuffle(countries)

        for question_num, country in enumerate(countries):
            correct_answer = country_capitals[country]
            all_capitals = list(country_capitals.values())
            wrong_answers = all_capitals[:]
            wrong_answers.remove(correct_answer)
            wrong_answers = random.sample(wrong_answers, 3)
            answer_options = wrong_answers + [correct_answer]
            random.shuffle(answer_options)
            
            # 4. ファイルへの書き込み
            quiz_file.write(f'{question_num + 1}. {country}の首都はどこですか?\n')
            for i in range(4):
                quiz_file.write(f"    {'ABCD'[i]}. {answer_options[i]}\n")
            quiz_file.write('\n')

            correct_answer_index = answer_options.index(correct_answer)
            answer_key_file.write(f"{question_num + 1}. {'ABCD'[correct_answer_index]}\n")

print(f"{quiz_num + 1}種類の問題集と解答集を'quizzes'フォルダに作成しました。")

まとめ

このスクリプトは、辞書、リスト、randomモジュール、ファイル操作といったPythonの基本的な機能を組み合わせることで、実用的なツールを作成できる良い例です。データさえ用意すれば、歴史の年号クイズや英単語テストなど、様々な種類の問題集を自動で生成するように応用できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次