随机抽题算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
随机抽题算法
0 引言
随机抽题是在线考试系统中的核心部分,目前大部分的在线考试系统或无纸化考试系统大都采用了随机函数实现随机抽题,但大部分在线考试系统在随机抽题时存在抽题速度慢、试题覆盖面不稳定、重点不突出、灵活性差等问题。
本文讨论了优化随机抽题的方法,给出了具体的抽题公式和查询语句。
1 优化使用随机函数方法研究
原始在线考试系统中,使用随机函数从题库中抽取试题,抽题公式为Int(Rnd*M)公式1。
在抽取第一题时,直接将题号存放在指定的空数组中,表示抽取成功,以后每抽取一题,将题号和数组中已存在元素进行比较,若存在则抽取失败,若不存在则抽取成功,并将题号依次存储在该数组中,直到抽取结束。
这种抽题方法的缺陷是时间浪费。
这种时间浪费在单机的时候并不明显,但在B/S模式或C/S模式下,机器越多速度越慢。
为了解决重复抽题,避免试题抽取过慢,可采用分段法、分类法和分类分段结合法。
1.1分段法分段法是解决重复抽题最简单的方法,其原理是将题库中的试题M
分成N段,然后从每段中抽取一题,抽取公式为Int(Rnd*(M\N))+i*(M\N)(0≤i≤N-1)公式2。
分段法的优点显而易见,可以完全杜绝试题重复抽取,但对题库中试题的数量有要求,即M>2N,且题库越大、试题数量越多,抽取效果就越好。
在公式2中将M等分成N段,M并不一定能被N整除,也就是说采用公式2试题库最后M MOD N条试题永远不会被抽取,为了解决这个问题,可将公式2进行改进,设L=M MOD N,则抽取公式为Int(Rnd*(M\N+1))+i*(M\N+1)(0≤i≤L-1)公式3和Int(Rnd*(M\N))+i*(M\N)+L(L≤i≤N-1)公式4。
分段法避免了重复抽取,但无法控制试题的覆盖面及难易程度。
1.21.2 分类法分类法是在试题库的结构上添加相应分类字段,字段可以是章
节、内容等,将所有试题按章节或内容分类,从每一类中抽取一题,不仅可以解决试题的重复抽取还可以控制试题的覆盖面。
通常将分类字段的类型设置为整形,采用一组连续的整数作为分类字段的取值范围,这样方便在试题库中对分类进行循环查询,查询语句为select*from试题库where分类字段名=i查询1,设查询记录数为Mi,则抽题公式为Int(Rnd*Mi)公式5。
分类法可以保证试卷的覆盖面,但没有侧重点。
1.31.3 分类分段结合法分类分段结合法在抽取试题时先分类,然后根据设定给
类分段,每类的分段数可以不同,从每个分段中抽取一题。
这种方法要求在数据库中另建分类分段表,存贮每个分类中的抽题数量,数量可以是零,表示该类中不抽取,可以是大于零并小于该类题量的任何一个数Ni,表示将该类分成Ni段,每段抽取一题。
从实现角度上看,分段法和分类法使用的是一维循环,分类分段法使用的是二维循环;从访问数据库角度看,分段法和分类法仅访问试题库,分类分段法除了访问试题库外还要访问分类分段表。
2特殊要求下随机抽题的应对策略
在实际应用中,会对试题的抽取有一些特殊的要求。
如何合理利用随机函数,在同一个试题库中抽取出适合不同系别、专业使用的试卷?随机函数并不是万能的,不可能独立处理以上问题,但是可以创造一个环境,随机函数在这个环境中通过简单的计算公式和相应的算法为不同系别、专业抽取需求不同的试卷。
为了
营造这种环境,通常会通过两方面来实现:一方面是修改表结构;另一方面是提供一个界面可以针对不同系别、专业设计不同的抽题条件。
2.1修改表结构修改表结构通常会在试题库中添加章、节、难度系数、出题日
期、出题教师等字段。
添加章、节字段既可以精确抽题范围,也可以避免抽到未学习的章节。
在抽取试题时针对完全学习的章和学习过部分小节的章可以采用不同的查询方法,对完全学习的章,可以仅对章字段进行查询:select*from试题库where章=k查询2,其中k为章数,对学习过部分小节的章,除了对章字段查询外还要对节进行查询,可以针对某一节进行查询:select*from试题库where章=k and节=j查询3,j为节数,也可以针对与所有学习过的小节:select*from试题库where章=k and节in(j1,j2,…jn) 查询4,其中j1,j2,…jn为该章中所有学习过的节数。
难度系数字段可以根据系、专业学习的难易程度,抽取对应试题的字段,针对不同的章、节的学习程度不同可以有不同的难度系数,以查询3为例查询可改为:select*from试题库where章=k and节=j and难度系数=i查询5,i为难度系数值。
为了抽取方便,可以在试题库的表结构中添加出题日期字段,字段值为试题编辑日期,可以按日期的范围抽取出符合条件的试题。
每个老师教学的重点会有差别,使用其他教师的试题可能难以评定学生的学习成果,可在试题库中加入命题教师字段,其值为命题教师工号,可以使用该字段为教师所带班级抽取试题。
2.22.2 提供设置抽题条件界面试题库虽然需要很多人不断的维护,但其表结构
是相对稳定的,只是在题目数量和内容方面有所变化。
但是作为使用在线考试系统的系部、专业,每一年、每一个学期都会变化,他们的抽题要求不尽相同,因此,在考试系统的后台操作中需要一个设置系部、专业抽题要求的界面,在这个界面中可以通过简单的选择为每个系部、专业、班级设置若干抽题条件并存储在抽题条件数据表中。
学生抽题时先判断学生的系部、专业、班级,然后从抽题条件数据表中读取对应的抽题要求,并将其转化成查询语句,在试题库中查出符合条件的试题进行抽取。
3交换算法在随机抽题中的应用
在大部分在线考试系统中采用现场随机抽取,试题不完全相同;也有一部分考试系统中采用提前随机抽取,即在考试前由老师启动试题抽取程序,考试时所有的考生都使用这套试题,只是试题的顺序不同。
作为现场随机抽取的方法前面已经讨论了,下面重点讨论提前随机抽取,提前随机抽取前半部分由老师抽取一套试题和现场抽取实现方法完全相同,后半部分是从抽取的试题当中使用随机函数重新抽取一遍以保证试题顺序不同。
为了避免重复抽取,降低实现难度,有些考试系统在改变试题顺序时采用了随机函数结合交换算法的方法,设抽取的题目数量为M,将抽取的所有题号存储在数组中,下标从1到M,则抽题公式为j=Int(Rnd*M)+1公式6,使用循环For i=1toM,抽题公式放入循环,将下标为i 的数组元素值和下标为j的数组元素值互换,这样可以得到一个新的试题排列
4结束语
本文对随机抽题的方法进行了深入的研究。
文中不仅讨论了优化使用随机函数避免抽题重复的方法和满足特殊抽题要求的应对策略,而且在试题重新排列中引入了交换算法结合随机函数。
灵活运用,可以设计出高效率、灵活性强、大覆盖面、重点突出的抽题模块。
注:1.文中公式采用VB程序设计语言,并设题库中共有试题数M、需抽取试题数N、随机函数Rnd。