在线考试系统随机抽题的改进_徐红英

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Computer Knowledge and Technology 电脑知识与技术软件设计开发本栏目责任编辑:谢媛媛第7卷第11期(2011年4月)在线考试系统随机抽题的改进

徐红英,李杰

(襄樊学院数学与计算机科学学院,湖北襄樊441053)

摘要:开发在线考试系统时,会遇到随机性抽题的问题。在分析常用的抽题算法后,试从种子唯一性角度来改进设计,这一思路也可用于其他利用VisualC#和SQLServer 开发网络程序需要获取唯一随机序列的地方。实验表明,改进后的方案抽题分布相对均匀。关键词:随机;唯一性;IP ;时间

中图分类号:TP311文献标识码:A 文章编号:1009-3044(2011)11-2605-02

The Improvement of the Examination Online System's Random Function

XU Hong-ying,LI Jie

(School of Mathematical and Computer Sciences,Xiangfan University,Xiangfan 441053,China)

Abstract:Random question selection is a difficult function of the examination online system.This paper intends to improve this function from the way of uniqueness of random seed.This idea is also suitable for other web programs with Visual C#and SQL Server when u -nique random sequence is needed.The simulation result shows the selected questions are relatively equally distributed in the whole ques -tion bank.

Key words:random;uniqueness;IP;time

在开发在线考试系统时,会遇到一个关键问题:如何随机抽题。具体来说,就是如何从已存储试题的数据库中随机抽出指定数目的不同试题,并在页面呈现出来。

1随机抽题分析

在.NET framework 中提供了一个专门用来产生随机数的类———System.Random 类,这个类属于自动导入的System 命名空间,在 中可以直接使用这个类。利用该类可以在程序中产生所谓的”伪随机数”。System.Random 类中的NextDouble 方法、NextBytes 方法和Next 方法都可以产生随机数。NextDouble 方法产生一个介于0.0和1.0之间的随机数,且随机数有可能相同;NextBytes 方法能产生一个数组,但不能限定已产生的数组中每个元素都在指定的范围内;Next 方法可以利用两个参数(intMinValue,intMaxValue)产生指定个数的在指定范围内的数,该方法被两次重载,分别为:”Next(intMaxValue)”用来取得小于”MaxValue ”的非负随机数,”Next()”用来取得任一个非负随机数,但不能确定数字互不相同,可以使用循环结构产生指定数目的一组数字,在循环过程中可以把每一次产生的数字和已产生的数字进行比较,这样就可以得到指定数目的一组互不相同的随机非负整数。

还有比较常用的一种方法:利用SQL 的newid()函数完成随机抽题功能。

上述前三种方法中,可以用Next 方法来产生指定数目的一组数字从数据库中选取试题时,还要编写比较复杂的SQL 语句,才能完成随机抽题的功能,而且不能做到让n 个同学之间所抽题目互不完全相同,第四种方法虽然较前面简单,但也不能做到让n 个同学之间所抽题目互不完全相同。

2改进方法

综合考虑前面几种方法,分析可知,随机函数的随机性决定于其随机种子的唯一性。在此想到能确定一个用户的客观条件,惟有时间和空间的结合,因此利用用户抽题的时刻与其使用电脑的IP 相结合为种子。我们可以通过以下语句获得用户IP 和当前时刻:

//获得用户IP

string[]sArray =Request.ServerVariables["remote_Addr"].ToString().Split('.');

//获得当前时刻(取从第6位到最后的字符)

string s1=(DateTime.Now.Ticks ).ToString().Substring(5)

那么怎么让它们完美结合呢?我们考虑使用一种简单的方法,将sArray[2]和sArray[3](选几个结合依网络大小而定)和当前时刻依序拼到一起转化为一个整数(当然也有其他组合方法,读者可以自行考虑),这样得到的种子必然各不相同,转化语句如下:

//IP 提取

String j=sArray[2]+sArray[3]+s1;

int k =Convert.ToInt32(j);

收稿日期:2011-02-02

基金项目:襄樊学院大学生科研项目(2010DXS014);襄樊学院2009年度教学研究项目(JY200943)

作者简介:徐红英(1989-),女,湖北黄冈人;李杰(1988-),男,湖北孝感人。

E-mail:xsjl@ Tel:+86-551-56909635690964ISSN 1009-3044Computer Knowledge and Technology

电脑知识与技术Vol.7,No.11,April 2011,pp.2605-26062605

Computer Knowledge and Technology 电脑知识与技术本栏目责任编辑:谢媛媛软件设计开发第7卷第11期(2011年4月)

然后利用以下语句完成随机抽题:

int[]arrNum;

public string differSamenessRandomNum(int num,int minValue,int maxValue)

//在区间[minValue,maxValue]取出num 个互不相同的随机数,返回数组。

{

string[]sArray =Request.ServerVariables["remote_Addr"].ToString().Split('.');

string s1=(DateTime.Now.Ticks).ToString().Substring(5);

String j=sArray[2]+sArray[3]+s1;

long k =Convert.ToInt64(j);

Random ra =new Random(unchecked((int)k));//保证产生的数字的随机性

arrNum =new int[num];

int tmp =0;

for (int i =0;i <=num -1;i++)

{tmp =ra.Next(minValue,maxValue);//随机取数

arrNum[i]=getRandomNum(arrNum,tmp,minValue,maxValue,ra);}//取出值赋到数组中

string s ="";

for (int i =0;i

{s +=Convert.ToString(arrNum[i])+",";}

return s;}

public int getRandomNum(int[]arrNum,int tmp,int minValue,int maxValue,Random ra)

{int n =0;

while (n <=arrNum.Length -1)

{if (arrNum[n]==tmp)//利用循环判断是否有重复

{tmp =ra.Next(minValue,maxValue);//重新随机获取。

getRandomNum(arrNum,tmp,minValue,maxValue,ra);}

n++;}

return tmp;}

即可保证抽到题目各不相同。

3测试效果

我们利用100个学生在100道题中选取5个题做测试,得到题目被选取曲线如图1~图2所示

图1单一时间生成方法图2改进后的生成方法

可以看出,改进后的波动比改进前要平稳(改进后分布相对均匀)。

4结论

本文只是提供了一个种子唯一性的思想,任何可以唯一决定用户的属性都可作为种子使用,这个依具体问题而定。而本文利用两个客观属性(IP 和时间),达到了为用户从题库均匀抽取试题的目的。可以应用到任何地方的随机抽取,希望对要用到无重复随机抽取的读者能有一定借鉴意义。

参考文献:

[1]张曜,张青 函数实用手册[M].北京:冶金工业出版社,2002.

[2]王小科.C#开发实战宝典[M].北京:清华大学出版社,2010.

[3]崔巍,王晓波,车蕾,等.数据库应用与设计[M].北京:清华大学出版社,2009.2606

相关文档
最新文档