关键词不能为空

当前您在: 主页 > 英语 >

计算机随机抽题算法

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-28 08:45
tags:

-

2021年2月28日发(作者:conquer)


为了便于说明问题,文中提供的代码中的变量


pd


为从题库中要抽取出来考试的试题数量,数据库表名


与字段名我都使用了中文,并仅以 判断题为例。




算法一




由 于不知道如何实现从题库中随机抽取试题的


sql


语句,我在网 上下载了几个免费的考试系统进行研


究,找到了第一种算法,其思路为先将数据库中所有 数据读出,获得试题的总数后,生成一个


1


~(试


题的总数-考试的试题数量)之间的随机数,然后从这里开始读出数据:




<% set rs=Object(






sql=


判断题


order by id asc






sql,conn,1,1






mycound=count


’取得试题总数




randomize


’初始化随机数种子值




n=fix((mycound-pd+1)*Rnd+1)



n


‘指针移到


n

< br>这个随机数这个位置




for i=1 to pd



session(

正确答案



‘用


session


来记录标准答案




‘输出试题及答案


%>









width=



<%=rs(


题目内 容




























<% xt



next



%>



这种算法基本上可以实现随机 抽取试题,


并让每个学生的试题和每一次刷新以后的试题都不相同,

但是


它的最大不足在于试题的先后顺序总是相同,


特别是题 库中试题不多的时候,


学生几乎可以用背答案方


法来应付考试了 。虽然可以通过改变数据的排序方式来改变试题的先后顺序,但变化总是不大。




算法二




第二种算法的思路很简单,就是不断生成


1

~题库中的试题总数之间的随机数,然后到数据库中读取这


条记录,直到满足考试的 试题量为止。




<%



set rs=Object(






sql=


判断题


order by id asc






sql,conn,1,1






mycound=count


’取得题库中的试题总数






for i=1 to pd




randomize




sid=int((mycound +1)*rnd+1)


‘生成


1


~题库中的试题总数之间的随机数



set rs=e(


判断题


where id=




while




randomize




sid=int((mycound +1)*rnd+1)




set rs=e(


判断题


where


id=


‘如果数据库中找不到这条试题,就


继续生成随机数读取试题。




wend



session(


正确答案



‘用


session


来 记录标准答案




‘输出试题及答案


%>









width=



<%=rs(


题目内 容




























<%



next



%>



这种算法应该是真正意义上的 随机抽取试题,


但是遗憾的是如果在题库中题量不多的情况下,


很容易会


在数据库中读取重复的试题,


如果再使用一个变量来储 存已经读取过的试题


id


来解决试题重复的问题,


算法就过于繁琐,是很不可取的。






算法二补充:



第二种算法的思路很简单,就是不断生成


1


~题库中的试题 总数之间的随机数,然后到数据库中读取这


条记录,


直到满足考 试的试题量为止。


当时我认为这种算法应该是真正意义上的随机抽取试题,


但是遗


憾的是如果在题库中题量不多的情况下,


很容 易会在数据库中读取重复的试题,


虽然也可以再使用一个


变量或 数组来储存已经读取过的试题


id


来解决试题重复的问题,算法 就过于繁琐。为此,我片面地认


为不可取的。其实用一个变量或数组来储存已经读取过的 试题


id


,在算法上并不繁琐。






<%



写一个生成随机记录的函数




Function rndtest(m_count,r_count)



’参 数


m_count


为试题总数,


r_c ount


为要读出的试题数




dim x,st,i



i=0



do while i>=r_count



randomize



x=fix(rnd*m_count)+1



’产生


1~m_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< /p>


将出现死循环,于是判断并跳出循环




loop



rndtest=st



end function



set rs=Object(



sql=


判断题


order by id asc



sql,conn,1,1



mycound =rndtest(count, pd)


’取得题库中的试题总数




testcound=split(mycound,





for i=0 to UBound(testcound)



teposition=matrix(i)


‘把记录指针移指向第


testcound (i)


条记录



session(


正确答案



‘用< /p>


session


来记录标准答案




‘输出试题及答案


%>







<% =rs(


题目内容
















<%



next



%>



算法三




由 于第二种算法容易造成试题重复,


为了避免系统产生重复的随机数,

我试着将题库中试题总数均分为


kp


个范围,让每个范围个 产生一个随机数,这样就有效地避免了随机数重复。




<% set rs=Object(






sql=


判断题


order by id asc






sql,conn,1,1






mycound=count


’取得试题总数




for i=1 to pd




randomize




temp=fix((fix(count/pd)+1)*rnd+1)

< p>
‘生成


1


~题库试题总数除以试卷试题数之间的随 机





temp


‘指针移到随机数位置




session(


正确答案


< p>
‘用


session


来记录标准答案




‘输出试题及答案


%>









width=



<%=rs(


题目内容















-


-


-


-


-


-


-


-



本文更新与2021-02-28 08:45,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/679979.html

计算机随机抽题算法的相关文章