计算机随机抽题算法
- 格式:doc
- 大小:41.50 KB
- 文档页数:11
随机抽题算法0 引言随机抽题是在线考试系统中的核心部分,目前大部分的在线考试系统或无纸化考试系统大都采用了随机函数实现随机抽题,但大部分在线考试系统在随机抽题时存在抽题速度慢、试题覆盖面不稳定、重点不突出、灵活性差等问题。
本文讨论了优化随机抽题的方法,给出了具体的抽题公式和查询语句。
1 优化使用随机函数方法研究原始在线考试系统中,使用随机函数从题库中抽取试题,抽题公式为Int(Rnd*M)公式1。
在抽取第一题时,直接将题号存放在指定的空数组中,表示抽取成功,以后每抽取一题,将题号和数组中已存在元素进行比较,若存在则抽取失败,若不存在则抽取成功,并将题号依次存储在该数组中,直到抽取结束。
这种抽题方法的缺陷是时间浪费。
这种时间浪费在单机的时候并不明显,但在B/S模式或C/S模式下,机器越多速度越慢。
为了解决重复抽题,避免试题抽取过慢,可采用分段法、分类法和分类分段结合法。
1.1分段法分段法是解决重复抽题最简单的方法,其原理是将题库中的试题M分成N段,然后从每段中抽取一题,抽取公式为Int(Rnd*(M\N))+i*(M\N)(0≤i≤N-1)公式2。
分段法的优点显而易见,可以完全杜绝试题重复抽取,但对题库中试题的数量有要求,即M>2N,且题库越大、试题数量越多,抽取效果就越好。
在公式2中将M等分成N段,M并不一定能被N整除,也就是说采用公式2试题库最后M MOD N条试题永远不会被抽取,为了解决这个问题,可将公式2进行改进,设L=M MOD N,则抽取公式为Int(Rnd*(M\N+1))+i*(M\N+1)(0≤i≤L-1)公式3和Int(Rnd*(M\N))+i*(M\N)+L(L≤i≤N-1)公式4。
分段法避免了重复抽取,但无法控制试题的覆盖面及难易程度。
1.21.2 分类法分类法是在试题库的结构上添加相应分类字段,字段可以是章节、内容等,将所有试题按章节或内容分类,从每一类中抽取一题,不仅可以解决试题的重复抽取还可以控制试题的覆盖面。
网上考试系统编制中的随机抽取试题的四种算法因为教学的需要,我决定编写一个asp+ms sql2000的网上考试系统,其功能主要为:实现判断题、单项多项选择题和填空题的在线自动答题、改卷;并将学生的错误答案记入数据库,供教师分析。
在编写从题库中随机抽取试题这一模块的算法上,却颇费了一番周折,现将解决过程记录如下,以供大家参考。
为了便于说明问题,文中提供的代码中的变量pd为从题库中要抽取出来考试的试题数量,数据库表名与字段名我都使用了中文,并仅以判断题为例。
算法一由于不知道如何实现从题库中随机抽取试题的sql语句,我在网上下载了几个免费的考试系统进行研究,找到了第一种算法,其思路为先将数据库中所有数据读出,获得试题的总数后,生成一个1~(试题的总数-考试的试题数量)之间的随机数,然后从这里开始读出数据:<% set rs=server.CreateObject("ADODB.RecordSet")sql="select * from 判断题 order by id asc"rs.open sql,conn,1,1mycound=rs.Recordcount '取得试题总数randomize '初始化随机数种子值n=fix((mycound-pd+1)*Rnd+1)rs.move n ‘指针移到n这个随机数这个位置for i=1 to pdsession("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.movenextnextrs.close%>这种算法基本上可以实现随机抽取试题,并让每个学生的试题和每一次刷新以后的试题都不相同,但是它的最大不足在于试题的先后顺序总是相同,特别是题库中试题不多的时候,学生几乎可以用背答案方法来应付考试了。
蒙特卡洛近似法蒙特卡洛近似法是一种利用随机抽样的方法来估计复杂计算问题的解的算法。
该算法以蒙特卡洛赌场为名,因为它的基本原理就是通过大量的随机采样来逼近真实情况,就像在赌场玩游戏一样。
下面将从算法的原理、应用场景和优缺点三个方面来详细介绍蒙特卡洛近似法。
一、算法原理蒙特卡洛近似法是一种随机化算法。
它的基本思想是,对于一个计算问题,我们无法直接求出它的解,但是可以采用随机抽样的方法来逼近它的解。
具体来说,算法流程如下:1. 对于需要求解的问题,我们可以将其转化为某个随机变量的期望。
例如,我们需要求解一个随机变量的期望值 E(X),可以表示为 E(X) =∫xf(x)dx,其中 f(x) 是 X 的概率密度函数。
这样,我们的问题就转化为求解这个期望值。
2. 为了估计这个期望值,我们可以通过随机抽样的方法来模拟 X 的分布。
具体来说,我们可以生成 n 个服从 f(x) 分布的随机变量X1,X2,…,Xn,然后根据它们的平均值来估计 E(X),即E(X) ≈(X1+X2+…+Xn)/n。
3. 当样本数 n 越来越大时,我们得到的估计值会越来越接近真实值。
这是因为根据大数定律,样本均值会以概率1收敛到期望值。
二、应用场景蒙特卡洛近似法在科学计算和工程问题中有着广泛的应用。
其典型应用包括:1. 财务分析:用于预测金融市场的波动性和风险。
2. 物理仿真:用于计算复杂的物理系统的行为,例如量子力学、原子结构和热力学。
3. 生物医学:用于评估疾病治疗和预防方法的效果,以及进行药物筛选和基因研究。
4. 工程设计:用于设计、建模和测试高风险系统,例如火箭、核反应堆和汽车碰撞测试。
三、优缺点蒙特卡洛近似法具有以下优点:1. 精度高:当样本数趋近于无穷大时,该算法能够提供接近真实值的估计。
2. 算法简单:该算法只需要进行随机抽样和简单的平均计算,算法流程简单易懂。
3. 可处理高维问题:该算法能够处理高维的计算问题,没有维度的限制。
考试试题随机抽题算法考试试题随机抽题算法在现代教育体系中,考试是一种常见的评估学生学习成果的方式。
而试题的难易程度、内容覆盖范围以及试题数量的合理安排,直接影响到考试的公平性和准确性。
为了确保考试的公正性,许多学校和机构采用了试题随机抽题算法。
试题随机抽题算法的目的是通过随机选择试题,使得每个考生所面对的试题都是从一个试题库中抽取的,以此确保考生之间的公平性。
这种算法的实现方式有多种,下面将介绍其中一种较为常见的试题随机抽题算法。
首先,需要建立一个试题库,其中包含了所有可能出现的试题。
试题库中的试题可以按照不同的知识点、难易程度、类型等进行分类和标记。
试题库的建立需要考虑到学科的特点和教学目标,以便能够全面评估学生的知识水平和能力。
在考试开始前,需要确定考试的试题数量和考试的时间限制。
试题数量的确定需要考虑到考试的目的和学科的特点。
时间限制的设定需要根据试题数量和难易程度来合理分配,以确保考生有足够的时间完成考试。
接下来,根据考试的要求和试题库中的试题分类,确定每个分类下要抽取的试题数量。
这个过程可以根据试题分类的重要性和难易程度来进行权重设置,以确保考试的全面性和准确性。
然后,利用随机数生成器来随机选择试题。
随机数生成器可以根据设定的范围和规则来生成随机数。
在试题抽取过程中,可以根据每个分类下要抽取的试题数量来设定随机数生成的范围,以确保每个分类下的试题都有机会被抽取到。
最后,将抽取到的试题按照一定的顺序组成试卷。
试卷的组成可以按照试题分类、难易程度或者其他规则来进行。
在组卷过程中,需要注意试题的顺序和分布,以确保试卷的整体平衡和合理性。
试题随机抽题算法的实现需要考虑到多个因素,如试题库的建立、试题数量的确定、试题分类的设置、随机数生成的规则以及试卷的组成等。
这些因素的合理安排和权衡可以确保考试的公平性和准确性。
试题随机抽题算法在现代教育中发挥着重要的作用。
它不仅能够提高考试的公平性和准确性,还能够激发学生的学习兴趣和动力。
使用计算机随机分组与随机抽样的方法及应用作者:叶晓琼来源:《电脑迷·中旬刊》2018年第01期摘要:本文探究了为改善由常规取整法、取余法带来的简单随机不平衡的缺点而探索新型随机分组和随机抽样方法,主要以Excel表格软件和SPSS分析软件为例分析了当前计算机在随机分组和抽样的应用现状,并针对进一步完善和加大计算机算法操作在该方面的应用提出了一些合理化建议。
关键词:随机分组;随机抽样;Excel;SPSS;算法研究1 引言正所谓随机抽样,就是在随机原则的基础上,等可能性的抽取样本,在这个过程当中,必须保证每一个样本的存在性(也即概率非零性)。
简单的拿掷骰子这一试验来讲,随机抽样的过程就是掷骰子的过程,而结果只有可能为数字1—6,也即全部样本,且出现这六种可能是相等的,这便就是等可能性的随机抽样试验。
而随机分组是将随机抽样的每个样本按一定的约定进行分类,例如将上例中掷出奇数点的归为一组,偶数点为另一组等分类方法。
在科学研究实验、调研调查研究和教育教学活动等实际工作中,往往都需要进行随机分组和随机抽样试验分析,因此,一个实用性良好的随机抽样算法,不仅可以大大提高随机样本的抽取效率,还可以提高试验的准确率等。
因此,对随机抽样算法,尤其是在样本元素无重复的算法研究和过程改进方面具有一定的实用研究价值。
随机抽样算法在计算机运行系统、数理统计和科学试验应用中有广泛应用,通常用于只需要处理部分数据,或者投资较大且费时费力的场合下。
2 Office办公软件—Excel表格在目前的随机实验和控制变量实验中,通常的做法是随机将被实验对象分配到实验组和对照组,同时为了尽量排除实验的随机性,将会安排多组实验。
具体做法是把实验对象按照其某一指标进行编号,这种编号是随机的,无任何主观因素。
随后,将被编号的实验对象打乱顺序,然后随机抽样进行盲选、分组。
这种方法顺序性强,随机性稳定,但是运算过程较为麻烦,另外,如果当实验对象和实验次数较多,对实验进程有较高限制时,这种方法费时费力的劣势便显露无遗。
在线考试系统论文考试管理系统论文-随机数在智能考试信息系统中的应用试卷自动生成系统是计算机辅助教学系统CAI(computer-aided instruction)的重要组成部分。
随着计算机普及,考试作为选拔人才、资格认证、等级确定的有效手段,正朝着自动化、智能化方向发展。
对于从事高校教学的教师来说,试卷自动生成系统可以减轻教师负担,避免重复工作,提高工作效率。
本系统从教学的实际需求出发,采用随机数模型的算法基础结合智能算法思想,在简单、稳定、易行的基础上,使组卷效率更高,系统冗余度更小,体现智能化。
一、随机数模型(一)随机数模型思想随机数应用范围广泛,可用于信息安全中的加密算法、安全口令,仿真,集成电路测试等。
随机数的产生分为两种:一是通过软件或数字电路实现一种确定性算法,这种输出序列是确定的,称为伪随机序列;另一种是通过一些特殊的物理现象或电路结构,如电磁辐射,热噪声等方法产生。
我们开发的智能考试信息系统ICAI-Test,采用第一种方法构造了随机模型,根据学生的答题情况,利用随机数产生不同试卷。
计算机生成的随机数必须满足下列要求:分布的均匀性,即尽可能地接近U(0,1)分布;统计上的独立性;产生随机数的速度足够快,以节省机时;应有足够的周期,即在其达到重复(循环)之前,能生成足够多的随机数;占用计算机的内存尽可能地少。
(二)随机数模型实现本系统的测试模块主要是以题库为基础的自动试卷系统,用Excel2005存储题库。
实现判断题、单项多项选择题和填空题的在线自动答题、改卷;并将学生的错误答案记入数据库。
从题库中随机抽取试题的算法,大致分为三步:Setp1.获取试题库试题总数,然后生成一个1~N的阵列,(设试题总数为N)。
Setp2.生成随机数,将这个矩阵打乱。
Setp3.按顺序取出阵列中的题目。
设题库总数为10,要抽取出5条题。
设原来题库阵列为A1,A2,A3,A4,A5,A6,A7,…A10。
为了便于说明问题,文中提供的代码中的变量pd为从题库中要抽取出来考试的试题数量,数据库表名与字段名我都使用了中文,并仅以判断题为例。
算法一由于不知道如何实现从题库中随机抽取试题的sql语句,我在网上下载了几个免费的考试系统进行研究,找到了第一种算法,其思路为先将数据库中所有数据读出,获得试题的总数后,生成一个1~(试题的总数-考试的试题数量)之间的随机数,然后从这里开始读出数据:<% set rs=server.CreateObject("ADODB.RecordSet")sql="select * from 判断题 order by id asc"rs.open sql,conn,1,1mycound=rs.Recordcount ’取得试题总数randomize ’初始化随机数种子值n=fix((mycound-pd+1)*Rnd+1)rs.move n ‘指针移到n这个随机数这个位置for i=1 to pdsession("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.movenextnextrs.close%>这种算法基本上可以实现随机抽取试题,并让每个学生的试题和每一次刷新以后的试题都不相同,但是它的最大不足在于试题的先后顺序总是相同,特别是题库中试题不多的时候,学生几乎可以用背答案方法来应付考试了。
虽然可以通过改变数据的排序方式来改变试题的先后顺序,但变化总是不大。
算法二第二种算法的思路很简单,就是不断生成1~题库中的试题总数之间的随机数,然后到数据库中读取这条记录,直到满足考试的试题量为止。
<%set rs=server.CreateObject("ADODB.RecordSet")sql="select * from 判断题 order by id asc"rs.open sql,conn,1,1mycound=rs.Recordcount ’取得题库中的试题总数rs.closefor i=1 to pdrandomizesid=int((mycound +1)*rnd+1) ‘生成1~题库中的试题总数之间的随机数set rs=conn.execute("select * from判断题where id="&sid)while rs.eofrandomizesid=int((mycound +1)*rnd+1)set rs=conn.execute("select * from判断题where id="&sid) ‘如果数据库中找不到这条试题,就继续生成随机数读取试题。
wendsession("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,ii=0do while i>=r_countrandomizex=fix(rnd*m_count)+1 ’’产生1~m_count的随机数if not instr(st,x)>0 thenst=st&x&"," ’’用,分割i=i+1end ifif i>=m_count then exit do ’’如果m_count小于r_count将出现死循环,于是判断并跳出循环looprndtest=stend functionset rs=server.CreateObject("ADODB.RecordSet")sql="select * from 判断题 order by id asc"rs.open sql,conn,1,1mycound =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 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,1mycound=rs.Recordcount ’取得试题总数for i=1 to pdrandomizetemp=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><%nextrs.close%>这种算法能够有效地解决了算法一和算法二的不足,既做到了随机抽取试题,又做到了试题不重复。
但是仔细一想还是存在不足:就是题库中的每一道试题出现的概率不相同,这样就显得不科学了。
因为kp次都产生大数字的概率是不大了,这样排在后面的试题出现的机会就很小了。
算法四算法四是我最后的研究结果,其算法分为三步:Setp1、获取试题库试题总数,然后生成一个1~试题总数的阵列。