小小白祈祷中...

前言

今天我们来聊一聊随机组卷。相信大家对这个词语都不陌生。

最常见的情况,许多在线课程的考试试题都是随机组卷产生的。比如某慧树:

img

由于网课的学生群体巨大,不可能为每一位学生单独命制试题,因此导致了随机组卷的诞生。

简单解释就是,各大教育平台都有自己的试题数据库,通过程序从试题库中随机抽取部分试题来组成一份试卷,这样能极大的提高出卷的时效性。

模拟随机组卷

下面,我们使用 python 来模拟一个简单的随机组卷的过程。

首先,我们得有一个`试题库,为简便起见,我们使用下面的字典作为试题库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
capitals = {
'黑龙江省':'哈尔滨市',
'吉林省':'长春市',
'辽宁省':'沈阳市',
'北京市':'北京',
'天津市':'天津',
'内蒙古自治区':'呼和浩特市',
'山西省':'太原市',
'陕西':'西安市',
'青海省':'西宁市',
'甘肃':'兰州市',
'新疆维吾尔自治区':'乌鲁木齐市',
'四川':'成都市',
'重庆市':'重庆',
'云南省':'昆明市',
'贵州省':'贵州市',
'广西壮族自治区':'南宁市',
'广东省':'广州市',
'湖南省':'长沙市',
'湖北省':'武汉市',
'河南省':'郑州市',
'河北省':'石家庄市',
'山东省':'济南市',
'安徽省':'合肥市',
'江苏省':'南京市',
'浙江省':'杭州市',
'上海市':'上海',
'江西省':'南昌市',
'福建省':'福州市',
'西藏':'拉萨市',
'海南省':'三亚市',
'宁夏回族自治区':'银川市',
'台湾省':'台北市'
}

没错,我们的试题就是找到我国各个省的省会城市的名称。当然,实际上的试题都来自各教育平台庞大的数据库。我们在这仅使用字典来学习和借鉴。有了试题库,我们就可以开始组卷了:

第一步,用一个列表来存储所有省名并打乱该列表元素的顺序

1
2
3
4
# states存储所有省名
states = list(capitals.keys())
# 随机打乱states列表元素的顺序
random.shuffle(states)

第二步,构建每个问题的四个选项(1正确答案+3错误答案)并打乱顺序

1
2
3
4
5
6
7
8
9
10
11
12
# 正确答案,questionNum为题目编号
correctAnswer = capitals[states[questionNum]]
# 错误答案列表
wrongAnswers = list(capitals.values())
# 当然,在错误答案中需去掉正确答案
del wrongAnswers[wrongAnswers.index(correctAnswer)]
# 错误答案从错误答案列表wrongAnswers中随机抽取三个
wrongAnswers = random.sample(wrongAnswers, 3)
# 一个正确答案和三个错误答案构成四个选项
answerOptions = wrongAnswers + [correctAnswer]
# 打乱四个选项的顺序
random.shuffle(answerOptions)

第三步,编写试卷文件(包括测试卷和答案卷)开头

每份试卷都有一部分相同的内容,比如标题,姓名,学号等:

1
2
3
4
5
6
7
quizFile = open('省会城市及省的简称测验%s.txt'%(quizNum + 1),'w')
answerKeyFile = open('省会城市及省的简称测验答案%s.txt'%(quizNum + 1),'w')

# 试卷标题
quizFile.write((' '*20) + '省会城市及省的简称测验 (试卷 %s)' % (quizNum + 1))
quizFile.write('\n\n姓名:__________________日期:__________________时间:_________________')
quizFile.write('\n\n')

第四步,添加随机试题和答案

1
2
3
4
5
6
7
8
# 向试题文件中写入问题
quizFile.write('%s.%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)]))

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import random

capitals = {
'黑龙江省':'哈尔滨市',
'吉林省':'长春市',
'辽宁省':'沈阳市',
'北京市':'北京',
'天津市':'天津',
'内蒙古自治区':'呼和浩特市',
'山西省':'太原市',
'陕西':'西安市',
'青海省':'西宁市',
'甘肃':'兰州市',
'新疆维吾尔自治区':'乌鲁木齐市',
'四川':'成都市',
'重庆市':'重庆',
'云南省':'昆明市',
'贵州省':'贵州市',
'广西壮族自治区':'南宁市',
'广东省':'广州市',
'湖南省':'长沙市',
'湖北省':'武汉市',
'河南省':'郑州市',
'河北省':'石家庄市',
'山东省':'济南市',
'安徽省':'合肥市',
'江苏省':'南京市',
'浙江省':'杭州市',
'上海市':'上海',
'江西省':'南昌市',
'福建省':'福州市',
'西藏':'拉萨市',
'海南省':'三亚市',
'宁夏回族自治区':'银川市',
'台湾省':'台北市'
}


# 产生十份随机试卷
for quizNum in range(10):
quizFile = open('省会城市及省的简称测验%s.txt'%(quizNum + 1),'w')
answerKeyFile = open('省会城市及省的简称测验答案%s.txt'%(quizNum + 1),'w')

# 试卷标题
quizFile.write((' '*20) + '省会城市及省的简称测验 (试卷 %s)' % (quizNum + 1))
quizFile.write('\n\n姓名:__________________日期:__________________时间:_________________')
quizFile.write('\n\n')

# states存储所有省名
states = list(capitals.keys())
# 随机打乱states列表元素的顺序
random.shuffle(states)

# 每份试题随机产生15个问题:
for questionNum in range(15):
# 正确答案
correctAnswer = capitals[states[questionNum]]
# 错误答案列表
wrongAnswers = list(capitals.values())
# 当然错误答案中去掉正确答案
del wrongAnswers[wrongAnswers.index(correctAnswer)]
# 错误答案从错误答案列表wrongAnswers中随机抽取三个
wrongAnswers = random.sample(wrongAnswers, 3)
# 一个正确答案和三个错误答案构成四个选项
answerOptions = wrongAnswers + [correctAnswer]
# 打乱四个选项的顺序
random.shuffle(answerOptions)

# 向试题文件中写入问题
quizFile.write('%s.%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()

随机组卷测试

运行程序,可以在当前目录下看到我们产生的10份随机试卷及答案

img

img