生成随机测试试卷及其答案的需求

需求描述

假如你是一位地理老师,班上有35名学生,你希望进行美国各州首府的一个小测验。
不妙的是,班里有几个坏蛋,你无法确信学生不会作弊。你希望随机调整问题的次序,
这样每份试卷都是独一无二的,这让任何人都不能从其他人那里抄袭答案。
当然,手工完成这件事又费时又无聊。好在,你懂一些Python。

下面是程序所做的事:

  • 创建35份不同的测验试卷。
  • 为每份试卷创建50个多重选择题,次序随机。
  • 为每个问题提供一个正确答案和3个随机的错误答案,次序随机。
  • 将测验试卷写到35个文本文件中。
  • 将答案写到35个文本文件中
  • 将州和它们的首府保存在一个字典中。
  • 针对测验文本文件和答案文本文件,调用open()、write()和close()。
  • 利用random.shuffle()随机调整问题和多重选项的次序

代码实现

import random

# The quiz data. Keys are states and values are their capitals.
# 以美国的洲名为键, 以洲的首府作为值
capitals = {
    'Alabama': 'Montgomery',
    'Alaska': 'Juneau',
    'Arizona': 'Phoenix',
    'Arkansas': 'Little Rock',
    'California': 'Sacramento',
    'Colorado': 'Denver',
    'Connecticut': 'Hartford',
    'Delaware': 'Dover',
    'Florida': 'Tallahassee',
    'Georgia': 'Atlanta',
    'Hawaii': 'Honolulu',
    'Idaho': 'Boise',
    'Illinois': 'Springfield',
    'Indiana': 'Indianapolis',
    'Iowa': 'Des Moines',
    'Kansas': 'Topeka',
    'Kentucky': 'Frankfort',
    'Louisiana': 'Baton Rouge',
    'Maine': 'Augusta',
    'Maryland': 'Annapolis',
    'Massachusetts': 'Boston',
    'Michigan': 'Lansing',
    'Minnesota': 'Saint Paul',
    'Mississippi': 'Jackson',
    'Missouri': 'Jefferson City',
    'Montana': 'Helena',
    'Nebraska': 'Lincoln',
    'Nevada': 'Carson City',
    'New Hampshire': 'Concord',
    'New Jersey': 'Trenton',
    'New Mexico': 'Santa Fe',
    'New York': 'Albany',
    'North Carolina': 'Raleigh',
    'North Dakota': 'Bismarck',
    'Ohio': 'Columbus',
    'Oklahoma': 'Oklahoma City',
    'Oregon': 'Salem',
    'Pennsylvania': 'Harrisburg',
    'Rhode Island': 'Providence',
    'South Carolina': 'Columbia',
    'South Dakota': 'Pierre',
    'Tennessee': 'Nashville',
    'Texas': 'Austin',
    'Utah': 'Salt Lake City',
    'Vermont': 'Montpelier',
    'Virginia': 'Richmond',
    'Washington': 'Olympia',
    'WestVirginia': 'Charleston',
    'Wisconsin': 'Madison',
    'Wyoming': 'Cheyenne'}


def main():
    # 为 35 位同学生成试卷
    for quizNum in range(35):
        # 打开一个试卷文件
        quizFile = open('cap/capitalsquiz%s.txt' % (quizNum + 1), 'w')
        # 打开一个答案文件
        answerKeyFile = open('cap/capitalsquiz_answers%s.txt' % (quizNum + 1), 'w')

        # 在卷子开头打印出一些信息
        quizFile.write('Name:\n\nDate:\n\nPeriod:\n\n')
        quizFile.write((' ' * 20) + 'State Capitals Quiz (Form %s)' % (quizNum + 1))
        quizFile.write('\n\n')

        # 打乱洲名
        states = list(capitals.keys())
        random.shuffle(states)

        # 每张试卷里面 50 道题目
        for questionNum in range(50):
            # 拿到正确的答案
            correctAnswer = capitals[states[questionNum]]

            # 生成排除正确答案之外的错误答案列表 错误的答案要从这里面随机生成
            wrongAnswers = list(capitals.values())
            del wrongAnswers[wrongAnswers.index(correctAnswer)]
            wrongAnswers = random.sample(wrongAnswers, 3)

            answerOptions = wrongAnswers + [correctAnswer]
            # 随机一下选择列表
            random.shuffle(answerOptions)

            # 写题目
            quizFile.write('%s. What is the capital of %s?\n' % (questionNum + 1, states[questionNum]))
            for i in range(4):
                quizFile.write(' %s. %s\n' %('ABCD'[i], answerOptions[i]))
                quizFile.write('\n')

            # 写入答案
            answerKeyFile.write('%s. %s\n' % (questionNum + 1, 'ABCD'[answerOptions.index(correctAnswer)]))

        quizFile.close()
        answerKeyFile.close()


if __name__ == "__main__":
    main()

后记

来自: 《python 编程快速上手 让繁琐工作自动化》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值