文章查询
 请输入查询关键字:
  
    
 
  本期导读>>
 

随机抽取试题的四种算法
平阳县职业教育中心    谢作如

    因为教学的需要,我决定编写一个ASP+MS SQL2000的网上考试系统,其主要功能为:实现判断题、单项多项选择题和填空题的在线自动答题、改卷,并将学生的错误答案记入数据库供教师参考,教师根据反馈及时调整教学。在编写从题库中随机抽取试题这一模块的算法上,我颇费了一番周折,现将解决过程记录如下,以供大家参考。
    为了便于说明问题,文中提供的代码中的变量“pd”为从题库中要抽取出来的考试试题数量,数据库表名与字段名都使用了中文,并仅以判断题为例。
    算法一
    由于不知道如何实现从题库中随机抽取试题的SQL语句,我从网上下载了几个免费的考试系统进行研究,找到了这种算法。其思路为:先将数据库中对应题型的所有数据读出,获得该题型试题的总数后,生成一个1至试题总数减去考试试题数之间的随机数,然后从这里开始读出数据。具体代码如下:


    这种算法基本上可以实现随机抽取试题,随机抽取的每个学生的试题都不相同。此算法最大的不足在于试题抽取的先后顺序总是相同,特别是题库中试题不多的时候,学生几乎可以用背答案的方法来应付考试了。虽然可以通过改变数据的排序方式来改变试题的先后顺序,但变化总是不大。
    算法二
    第二种算法的思路很简单,就是不断生成1至题库中的试题总数之间的随机数,并读取数据库中相应的记录,直到抽取的试题量达到“pd”个为止。

    程序中输出试题及备选答案部分的代码和第一种算法相同,这里就省略了,以下算法同此。这种算法应该是真正意义上的随机抽取试题算法,但遗憾的是在题库中题量不多的情况下,很容易重复读取试题。如果再使用一个变量储存已经读取过的试题id来解决以上问题,整个算法就过于繁琐,是很不可取的。
    算法三
    为了避免系统产生重复的随机数,我试着将题库中的判断题以试题数为基数等分为若干个范围,让每个范围产生一个随机数,这样就有效避免了随机数重复。

    这种算法有效解决了算法一和算法二的不足,既做到了随机抽取试题,又能达到试题不重复的目的。但是,仔细一想还是存在不足,那就是题库中的每一道试题出现的概率不相同。因为“kp”次都产生大数字的概率不大,排在后面的试题出现的机会就很小了。这样,算法就显得不科学。
    算法四
    经过多次改进,我得到了算法四。其算法分为三步:第一步,获取试题库判断题试题总数,然后生成一个1至试题总数的阵列。第二步,生成随机数,将这个矩阵打乱。第三步,按顺序取出阵列中的题目。此算法和洗牌的原理相类似,说明如下:(假设试题库中判断题总数为10道,要抽取出5道。)
    第一步:生成一个1至试题总数的阵列,阵列的初始内容如下表。

    第二步:生成两个随机数,如3和6。然后将阵列中A3和A6的内容交换,交换后的阵列的内容如下表所示。

    第三步:按顺序取出阵列中A1~A5的数据,即1、2、6、4、5,然后读出数据库中相应的试题。
不断循环第二步,该阵列中的内容就随机打乱。这样,既实现了随机抽取试题的目的,又避免了试题抽取重复。相应的代码如下:

    相对来说,算法四应该是最合理的。但是我还存在以下疑惑:应该循环第二步多少次阵列中的数值最“随机”?在试题库中的试题总数很大的情况下,这种算法是否会占用很多系统资源?欢迎大家发邮件来和我讨论。我的E-mail:admin@pyjy.net。
    (以上代码在Windows2000 server +SQL2000、Windows2000 server +Access调试通过。程序演示网址://www.kpcn.org/test/。)



你的评论   所有评论
昵称:
评论: