我要投稿 | 我要留言

基于VFP数据库技术考场座位的随机编排

2013-03-27 08:43:55 责任编辑:admin 来源: 浏览次数: [字体: ]

 

基于VFP数据库技术考场座位的随机编排
                                湖北省大冶市第一中学   黄涛
 
关键词:考场编排 随机算法 数据库
前言:考场编排是考试信息管理中的一项重要工作,科学的考场编排方法可以对考务管理起到很大的促进作用。然而面对这一繁重的资源安排和处理工作,长期以来学校教务部门一直主要靠非随机完成,使排考效果非常不科学。本文根据全国普通高校招生考试有关编排考场的要求 ,结合VFP技术给出一类编排考场的算法 ,用于实现计算机自动编排考场,该算法具有速度快、易于实现、随机性强的特点 ,通用性强。
一、            问题描述
1、 怎样得到一个指定范围的随机数值。随机数的产生是随机的,而针对每次考试的考生数,应该把随机数值控制在考生数之内,如果超出就毫无意义。
2、 如何设置数据库中的表,使得算法更为速度快,简洁。VFP数据库技术必须要有考生的数据库,而数据库里面的表如何设置,将会影响整个算法速度、简洁,不会造成混乱。
3、 怎样使得算法更具通用性。一个算法不是针对一个问题,而是针对一类问题,如果很好的处理通用性的问题,将会使算法得到广泛的应用。
4、 算法中涉及到的循环结构,该如何处理。涉及到的考生不只一个,要对每一个进行相同的操作,这就要涉及到循环,而对于不同的考生,考场及座位号不会相同,怎样来处理这个循环结构是关键。
二、            问题模型
学校举行一次全真模似考试,理科与文科假设一样,共有考生人数为r,考场总数为kc。因为考室大小及考室多少的原因,每个考室坐的考生人不尽相同,也许有的考室为32人,有的是28人,有的是27。
三、            解决问题
结合问题描述和问题的模型,对算法中所遇到的难题,做以下分析解答:
1在VFP中,随机数的产生可以用随机数函数rand(),它能产生介于0至1之间的任意小数。若要产生一个介于m,n   (m<n)之间整数,则是 int(t*rand()%n + m)。其中,t的取值决定于n,如果0 <= n < 10 ,则t取10;如果 10 <= n < 100 ,则t取100;如果100 <= n < 1000,则t取1000;如果1000 <= n < 10000,则t取10000。这是因为rand()得出的是整数位为0的小数,故而用到t来相乘,得到相应的数x1,而x1再对n来求余,这样t*rand()%n得的数值y最大为n,最小为0。而y值可能带有小数位,故而要用到函数int()int()为一取整函数,如,int(1.12) = 1。这时int(t*rand()%n + m)得出的值才会是一个介于m到n之间的整数。该算法中引用随机数来指定表中的某一个考生,即代表着表中的某一条记录号,然后再对该考生进行分布相应的考场,考号。
2、因为该算法涉及到数据库,因此该算法将主要是对表的操作。事先对相应表进行一些设置,是整个算法的前提,决定整个算法的速度及简洁。设要操作的表名为表1,包含的记录有2100条,其中包含的必要字段有,考号、姓名、考室、座位号、标志,如图:
一开始就把考室、座位号、标志设置为0。这里面除标志字段外,其它的字段都易理解。标志字段又有何用呢,这要说说随机函数rand()的特性。int(t*rand()%n + m)产生的随机整数并不是每一次都不尽相同。就如这2100考生,只要运行2100次int(t*rand()%n + m)就可以产生1100个不同的整数,这是不可能实现的。有可能第1次随机产生的数值与第101次产生的数值相同,而表1中每一条记录代表着一个学生的考场信息,代表着不同的个体信息,这样就会造成混乱。这里引用标志字段,如果某次产生的随机数值第一次指向某一条记录。这时,将该条记录的标志字段设置为1,等再次产生的随机数值指向该条记录时,可以用标志位来判断该随机数值是否产生过。这样,我们就不会重复多次在同一个考生身上分考布场信息。
3、通用性对于一个算法来说,是成与败的至关重要条件,是得到别人认可的关键。针对问题的模型,我们知道每
   每一次考试的考生数、考场数、每一考室的人数可能不尽相同。解决这一问题最好的方法,是在算法中引入input命令,每次考试都重新输入考生人数、考场数、相同人数的考室的人数。这样,就会很好的解决通用性的问题,以后每次考试都可以用相同的程序。
    4、循环结构对于整个算法来说是不可避免,对于2100考生,取随机数值的次数决不仅仅是2100次,而是更多。如上面所设,表1中共有2100个考生,要对每一个考生都进行分布考场信息,这就要至少2100次的调用int(t*rand()%n + m)来产生随机数值。而前面我们也提到有可能每次产生的数值有可能相同,如果使用最常用的for 循环的结构语句,并不能很好的完成考场的分布。这时,条件循环结构语句do while成为最为适合的选择。设该条件为x < 2100,x的初始值为0。这样,结合标志字段每次产生一个正确的随机数值,x就累加一次,一次累加到x = 2100。这时循环将会退出,完成对每个考生分布考场的信息。条件循环语句无疑是整个算法最好的选择。
 
四、结束语
        根据考场编排的现状,对于考场编排中随机算法的实现,将会为各学校提供便利。特别是对于各学校来说,考场编排中随机算法的实现对考务管理起到很大的促进作用使同校考生尽量分散开来, 彼此不相互邻接, 从而减少作弊的可能性。这种算法又快又合理的安排考试,直接决定了教务工作的效率,。
五、附源代码
USE 表1
 REPLACE ALL 考室 WITH 0,座位号 WITH 0,标志 WITH 0
 COUNT FOR ALLTRIM(姓名) <> '0' TO r
 DO CASE
 CASE r < 10000 AND r >= 1000
   t = 10000
 CASE r < 1000 AND r >= 100
   t = 1000
 CASE r < 100 AND r >= 10
   t = 100
 CASE r < 10 AND r >= 1
   t = 10
 ENDCASE
 input '请输入该次要分的考场的总数 kc = ' to kc
 input '请输入该次要分的考场的超始考场值 k = ' to k
 x = 0
 h = 1
 DO WHILE x < r
 input ' 请输入该相同人数考场超始值为 k1 = ' to k1
 input ' 请输入该相同人数考场终止值为(注意要与k1连续) k2 = ' to k2
 input ' 请输入该类每个考场的人数为 kr = ' to kr
 DO WHILE k1 < k2 + 1  
   m = INT(t*RAND()%r + 1)
   GOTO m
   f = 标志
   IF f = 0 THEN
    REPLACE 考室 WITH k1
    REPLACE 座位号 WITH h
    REPLACE 标志 WITH 1
    h = h + 1
    x = x + 1
    IF h = kr + 1 THEN
     k1 = k1 + 1
     h = 1
    ENDIF
   ENDIF
 ENDDO
 ENDDO
USE

                               本文发表于(中国教育信息化(CN11-5572/TP))

上一篇:高一年级作文竞赛获一等奖  下一篇:思则变 变则通

相关文章

[推荐] [收藏] [打印] [关闭] [返回顶部]

最新图片文章

最新文章