|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
强大的可扩展性。ASP具有强大的扩展性,可以实现与多种网络、硬件设备的连接:通过专用的通讯线路远程接入企业; 通过远程拨号服务器为远程拨号客户提供服务;通过WAP为移动电话互联网客户服务。算法|随机 由于教授教养的需求,我决意编写一个asp+ms sql2000的网上测验体系,其功效次要为:完成判别题、单项多项选择题和填空题的在线主动答题、改卷;并将先生的毛病谜底记入数据库,供教员剖析。在编写从题库中随机抽取试题这一模块的算法上,却颇费了一番周折,现将处理进程纪录以下,以供人人参考。 为了便于申明成绩,文中供应的代码中的变量pd为从题库中要抽掏出来测验的试题数目,数据库表名与字段名我都利用了中文,并仅以判别题为例。
算法一
因为不晓得若何完成从题库中随机抽取试题的sql语句,我在网高低载了几个收费的测验体系停止研讨,找到了第一种算法,其思绪为先将数据库中一切数据读出,取得试题的总数后,生成一个1~(试题的总数-测验的试题数目)之间的随机数,然后从这里入手下手读出数据:
<% set rs=server.CreateObject("ADODB.RecordSet")
sql="select * from 判别题 order by id asc"
rs.open sql,conn,1,1
mycound=rs.Recordcount '获得试题总数
randomize '初始化随机数种子值
n=fix((mycound-pd+1)*Rnd+1)
rs.move n ‘指针移到n这个随机数这个地位
for i=1 to pd
session("pdda")=session("pdda")&rs("准确谜底")&"|" ‘用session来纪录尺度谜底
‘输入试题及谜底%>
<tr>
<td width="10%" ><%=i%>、<%=rs("标题内容")%></td>
<td align="center" width="10%" ><select name="cate<%=i%>">
<option selected value=True>对</option>
<option value=False>错</option></select> </td>
</tr>
<% rs.movenext
next
rs.close%>
这类算法根基上可以完成随机抽取试题,并让每一个先生的试题和每次刷新今后的试题都不不异,然而它的最大缺乏在于试题的前后按次老是不异,出格是题库中试题不多的时分,先生几近可以用背谜底办法来敷衍测验了。固然可以经由过程改动数据的排序体例来改动试题的前后按次,但变更老是不大。
算法二
第二种算法的思绪很复杂,就是不休生成1~题库中的试题总数之间的随机数,然后到数据库中读取这笔记录,直到知足测验的试题量为止。
<%
set rs=server.CreateObject("ADODB.RecordSet")
sql="select * from 判别题 order by id asc"
rs.open sql,conn,1,1
mycound=rs.Recordcount '获得题库中的试题总数
rs.close
for i=1 to pd
randomize
sid=int((mycound +1)*rnd+1) ‘生成1~题库中的试题总数之间的随机数
set rs=conn.execute("select * from判别题where id="&sid)
while rs.eof
randomize
sid=int((mycound +1)*rnd+1)
set rs=conn.execute("select * from判别题where id="&sid) ‘假如数据库中找不到这条试题,就持续生成随机数读取试题。
wend
session("pdda")=session("pdda")&rs("准确谜底")&"|" ‘用session来纪录尺度谜底
‘输入试题及谜底%>
<tr>
<td width="10%" ><%=i%>、<%=rs("标题内容")%></td>
<td align="center" width="10%" ><select name="cate<%=i%>">
<option selected value=True>对</option>
<option value=False>错</option></select> </td>
</tr>
<%
next
%>
这类算法应当是真正意义上的随机抽取试题,然而遗憾的是假如在题库中题量不多的情形下,很轻易会在数据库中读取反复的试题,假如再利用一个变量来贮存已读取过的试题id来处理试题反复的成绩,算法就过于繁琐,是很不成取的。
算法二增补:
第二种算法的思绪很复杂,就是不休生成1~题库中的试题总数之间的随机数,然后到数据库中读取这笔记录,直到知足测验的试题量为止。事先我以为这类算法应当是真正意义上的随机抽取试题,然而遗憾的是假如在题库中题量不多的情形下,很轻易会在数据库中读取反复的试题,固然也能够再利用一个变量或数组来贮存已读取过的试题id来处理试题反复的成绩,算法就过于繁琐。为此,我单方面地以为不成取的。其适用一个变量或数组来贮存已读取过的试题id,在算法上其实不繁琐。
<%
写一个生成随机纪录的函数
Function rndtest(m_count,r_count) ''参数m_count为试题总数,r_count为要读出的试题数
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将呈现逝世轮回,因而判别并跳出轮回
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来纪录尺度谜底
‘输入试题及谜底%>
<tr>
<td width="10%" ><%=i%>、<%=rs("标题内容")%></td>
<td align="center" width="10%" ><select name="cate<%=i%>">
<option selected value=True>对</option>
<option value=False>错</option></select> </td>
</tr>
<%
next
%>
算法三
因为第二种算法轻易形成试题反复,为了不体系发生反复的随机数,我试着将题库中试题总数均分为kp个局限,让每一个局限个发生一个随机数,如许就无效地防止了随机数反复。
<% set rs=server.CreateObject("ADODB.RecordSet")
sql="select * from 判别题 order by id asc"
rs.open sql,conn,1,1
mycound=rs.Recordcount '获得试题总数
for i=1 to pd
randomize
temp=fix((fix(rs.Recordcount/pd)+1)*rnd+1) ‘生成1~题库试题总数除以试卷试题数之间的随机数
rs.move temp ‘指针移到随机数地位
session("pdda")=session("pdda")&rs("准确谜底")&"|" ‘用session来纪录尺度谜底
‘输入试题及谜底%>
<tr>
<td width="10%" ><%=i%>、<%=rs("标题内容")%></td>
<td align="center" width="10%" ><select name="cate<%=i%>">
<option selected value=True>对</option>
<option value=False>错</option></select> </td>
</tr>
<%next
rs.close%>
这类算法可以无效地处理了算法一和算法二的缺乏,既做到了随机抽取试题,又做到了试题不反复。然而细心一想仍是存在缺乏:就是题库中的每道试题呈现的几率不不异,如许就显得不迷信了。由于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
10
Setp2:
生成两个随机数,如3和6。然后将A3和A6的内容互换,阵列的内容变成:
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
1
2
6
4
5
3
7
8
9
10
Setp3、按按次掏出阵列中的标题A1~A5的内容,应当是1、2、6、4、5,读出数据库中响应的试题。
假如不休轮回Setp2,该阵列中的内容就随机打乱,如许既完成了随机抽取试题的目标,又防止了试题抽取反复。
<%
dim matrix() '界说变量数组
set rs=server.CreateObject("ADODB.RecordSet")
sql="select * from 判别题order by id asc"
rs.open sql,conn,1,1
mycound=rs.Recordcount '获得试题总数
'设定阵列的初始值
for i=0 to mycound
matrix(i)=i+1
next
randomize '生成随机数种子
for i=0 to 2*mycound ‘轮回2*试题总数次
j=fix(rnd*mycound)
k=fix(rnd*mycound)
'互换matrix(k)和matrix(j)的内容
temp=matrix(k)
matrix(k)=matrix(j)
matrix(j)=temp
next
'掏出阵列中的标题,数目为试卷中该类题的数目
for i=1 to pd
rs.absoluteposition=matrix(i) ‘把纪录指针移指向第matrix(i)笔记录
session("pdda")=session("pdda")&rs("准确谜底")&"|" ‘用session来纪录尺度谜底
‘输入试题及谜底%>
<tr>
<td width="10%" ><%=i%>、<%=rs("标题内容")%></td>
<td align="center" width="10%" ><select name="cate<%=i%>">
<option selected value=True>对</option>
<option value=False>错</option></select> </td>
</tr>
<%next
rs.close%>
算法四增补:
事先没法处理界说一个足够大的数组,因而用dim matrix(X),预设一个足够大的数字X。固然说临时不会呈现成绩,然而假如数据库中的试题数很大呢?总像一块石头搁在心中。呵呵。如今发明了ReDim语句,vbs参考中是如许引见ReDim 语句的:在进程级中声明静态数组变量并分派或从头分派存储空间。如许用ReDim matrix (rst.Recordcount)就能够完善地处理了这个成绩。
<%
Dim matrix()
set rs=server.CreateObject("ADODB.RecordSet")
sql="select * from 判别题order by id asc"
rs.open sql,conn,1,1
mycound=rs.Recordcount '获得试题总数
ReDim matrix(rst.Recordcount) ‘界说一个等于rst.Recordcount的数组
'设定阵列的初始值
for i=0 to mycound
matrix(i)=i+1
next
randomize '生成随机数种子
for i=0 to 2*mycound ‘轮回2*试题总数次
j=fix(rnd*mycound)
k=fix(rnd*mycound)
'互换matrix(k)和matrix(j)的内容
temp=matrix(k)
matrix(k)=matrix(j)
matrix(j)=temp
next
'掏出阵列中的标题,数目为试卷中该类题的数目
for i=1 to pd
rs.absoluteposition=matrix(i) ‘把纪录指针移指向第matrix(i)笔记录
session("pdda")=session("pdda")&rs("准确谜底")&"|" ‘用session来纪录尺度谜底
‘输入试题及谜底%>
<tr>
<td width="10%" ><%=i%>、<%=rs("标题内容")%></td>
<td align="center" width="10%" ><select name="cate<%=i%>">
<option selected value=True>对</option>
<option value=False>错</option></select> </td>
</tr>
<%next
rs.close%>
总结:
绝对来讲,算法四应当是最公道的。然而我不晓得应当轮回Setp2几何次,阵列中的数值最“随机”,并且我不晓得当试题库的试题总数良多的情形下,这类算法是不是会很占体系资本,接待人人来信和我会商。
因为现在数据库都使用标准的SQL语言对数据库进行管理,所以如果是标准SQL语言,两者基本上都可以通用的。SQL Server还有更多的扩展,可以用存储过程,数据库大小无极限限制。 |
|