资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
网上考试系统编制中的随机抽取试题的网上考试系统编制中的随机抽取试题的 四种算法四种算法因为教学的需要,我决定编写一个 asp+ms sql2000 的网上考试系统,其功 能主要为:实现判断题、单项多项选择题和填空题的在线自动答题、改卷;并 将学生的错误答案记入数据库,供教师分析。在编写从题库中随机抽取试题这 一模块的算法上,却颇费了一番周折,现将解决过程记录如下,以供大家参考 。 为了便于说明问题,文中提供的代码中的变量 pd 为从题库中要抽取出来考试的 试题数量,数据库表名与字段名我都使用了中文,并仅以判断题为例。算法一算法一由于不知道如何实现从题库中随机抽取试题的 sql 语句,我在网上下载了几个 免费的考试系统进行研究,找到了第一种算法,其思路为先将数据库中所有数 据读出,获得试题的总数后,生成一个 1(试题的总数考试的试题数量) 之间的随机数,然后从这里开始读出数据:、“ 对 错 这种算法基本上可以实现随机抽取试题,并让每个学生的试题和每一次刷新以 后的试题都不相同,但是它的最大不足在于试题的先后顺序总是相同,特别是 题库中试题不多的时候,学生几乎可以用背答案方法来应付考试了。虽然可以 通过改变数据的排序方式来改变试题的先后顺序,但变化总是不大。算法二算法二第二种算法的思路很简单,就是不断生成 1题库中的试题总数之间的随机数 ,然后到数据库中读取这条记录,直到满足考试的试题量为止。、“ 对 错 这种算法应该是真正意义上的随机抽取试题,但是遗憾的是如果在题库中题量 不多的情况下,很容易会在数据库中读取重复的试题,如果再使用一个变量来 储存已经读取过的试题 id 来解决试题重复的问题,算法就过于繁琐,是很不可 取的。算法二补充:算法二补充:第二种算法的思路很简单,就是不断生成 1题库中的试题总数之间的随 机数,然后到数据库中读取这条记录,直到满足考试的试题量为止。当时我认 为这种算法应该是真正意义上的随机抽取试题,但是遗憾的是如果在题库中题 量不多的情况下,很容易会在数据库中读取重复的试题,虽然也可以再使用一 个变量或数组来储存已经读取过的试题 id 来解决试题重复的问题,算法就过于 繁琐。为此,我片面地认为不可取的。其实用一个变量或数组来储存已经读取 过的试题 id,在算法上并不繁琐。=r_count randomize x=fix(rnd*m_count)+1 产生 1m_count 的随机数 if not instr(st,x)0 then st=st&x&“,“ 用,分割 i=i+1 end if if i=m_count then exit do 如果 m_count 小于 r_count 将出现死循环 ,于是判断并跳出循环 loop rndtest=st end function set rs=server.CreateObject(“ADODB.RecordSet“) sql=“select * from 判断题 order by id asc“ rs.open sql,conn,1,1 mycound =rndtest(rs.Recordcount, pd) 取得题库中的试题总数 testcound=split(mycound, “) for i=0 to UBound(testcound) rs.absoluteposition=matrix(i) 把记录指针移指向第 testcound (i) 条记录 session(“pdda“)=session(“pdda“)&rs(“正确答案“)&“|“ 用 session 来记录标准答案 输出试题及答案%、“ 对 错 算法三算法三由于第二种算法容易造成试题重复,为了避免系统产生重复的随机数,我试着 将题库中试题总数均分为 kp 个范围,让每个范围个产生一个随机数,这样就有 效地避免了随机数重复。、“ 对 错 这种算法能够有效地解决了算法一和算法二的不足,既做到了随机抽取试题, 又做到了试题不重复。但是仔细一想还是存在不足:就是题库中的每一道试题 出现的概率不相同,这样就显得不科学了。因为 kp 次都产生大数字的概率是不 大了,这样排在后面的试题出现的机会就很小了。算法四算法四算法四是我最后的研究结果,其算法分为三步:Setp1、获取试题库试题总数,然后生成一个 1试题总数的阵列。Setp2、生成随机数,将这个矩阵打乱。Setp3、按顺序取出阵列中的题目。这种算法和洗牌的原理相类似,图示如下:(设试题库总数为 10,要抽取出 5 道题)Setp1:阵列的初始内容如下:A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 1 2 3 4 5 6 7 8 9 10Setp2:生成两个随机数,如 3 和 6。然后将 A3 和 A6 的内容交换,阵列的内容变为:A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 1 2 6 4 5 3 7 8 9 10Setp3、按顺序取出阵列中的题目 A1A5 的内容,应该是 1、2、6、4、5,读出 数据库中相应的试题。如果不断循环 Setp2,该阵列中的内容就随机打乱,这样既实现了随机抽取试 题的目的,又避免了试题抽取重复。、“ 对 错 算法四补充:算法四补充:当时无法解决定义一个足够大的数组,于是用 dim matrix(X),预设一个 足够大的数字 X。虽然说暂时不会出现问题,但是如果数据库中的试题数很大 呢?总像一块石头搁在心中。呵呵。现在发现了 ReDim 语句,vbs 参考中是这 样介绍 ReDim 语句的:在过程级中声明动态数组变量并分配或重新分配存储空 间。这样用 ReDim matrix (rst.Recordcount)就可以完美地解决了这个问题。、“ 对 错 总结:总结:相对来说,算法四应该是最合理的。但是我不知道应该循环 Setp2 多少次,阵 列中的数值最“随机”,而且我不知道当试题库的试题总数很多的情况下,这 种算法是否会很占系统资源,欢迎大家来信和我讨论。我简单介绍一下,在一个窗体中已经抽出了试题,抽取的在“是否选中”字段中为“1” Dim myrnd(20) As Integer j = 0 Do While j 20 Randomize myrnd(j) = Round(Rnd * 40) Set myre = New ADODB.Recordset myre.Open “select * from 单选 where ID=“ & myrnd(j), cnn2, adOpenDynamic, adLockPessimistic 注意看下面的程序,我在另一个窗体中把抽出的试题依次显示出来 Set myre = New ADODB.Recordset myre.Open “select * from 单选 where 是否选中 =“ & 1 & “, cnn2, adOpenDynamic, adLockPessimistic Dim num As String nun = “ num = “id=“ & 1 & “ num = “id=“ & myrnd(0) & “ myre.Find num Label7.Caption = Trim(myre!内容) Label8.Caption = Trim(myre!A) Label9.Caption = Trim(myre!B) Label10.Caption = Trim(myre!C) Label11.Caption = Trim(myre!d) 运行时,提示错误:Label7.Caption = Trim(myre!内容) 上面这句话,应用程序定义或对象定义错误 有劳各位看看
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号