ASP编程:网上测验体系编制中的随机抽取试题的四...
强大的可扩展性。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>
<tdwidth="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>
<tdwidth="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还有更多的扩展,可以用存储过程,数据库大小无极限限制。 下面简单介绍一下我学习ASP的方法,希望对想学习ASP的朋友有所帮助... 弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。 不是很难但是英文要有一点基础网上的教程很少有系统的详细的去买书吧,另不用专门学习vb关于vbscript脚本在asp教材都有介绍 我想问如何掌握学习节奏(先学什么再学什么)最好详细点? ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp),它可以看作是VC和Java的混合体吧。 先学习用frontpage熟悉html编辑然后学习asp和vbscript建议买书进行系统学习 兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的 最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。 我就感觉到ASP和一些常用的数据库编程以及软件工程方面的思想是非常重要的。我现在也在尝试自己做网页,这其中就用到了ASP,我想它的作用是可想而知的。 弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。 ASP的语言不仅仅只是命令格式差不多,而是包含在<%%>之内的命令完全就是VB语法。虽然ASP也是做为单独的一个技术来提出的,但他就是完全继承了VB所有的功能。 ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 接下来就不能纸上谈兵了,最好的方法其实是实践。实践,只能算是让你掌握语言特性用的。而提倡做实际的Project也不是太好,因为你还没有熟练的能力去综合各种技术,这样只能使你自己越来越迷糊。 弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。 我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标. 交流是必要的,不管是生活还是学习我们都要试着去交流,通过交流我们可以学到很多我们自己本身所没有的知识,可以分享别人的经验甚至经历。 另外因为asp需要使用组件,所以了解一点组件的知识(ADODB也是组件) ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题:
页:
[1]