WEB应用中产生大量不同随机数的方法
2010-01-15李幼平
李幼平
(武汉工业学院计算机与信息工程系,湖北武汉 430023)
WEB应用中产生大量不同随机数的方法
李幼平
(武汉工业学院计算机与信息工程系,湖北武汉 430023)
在计算机应用中,很多时候需要大量产生不同随机数,传统的利用数组获取不同随机数的方法效率低,在随机数要求大量时更显得无能为力,尤其在WEB应用中,客户端的不断请求很容易加大服务器的负荷而无法完成,本文通过数据库排序随机与随机数分段相结合的方法,有效的解决了此类问题。
WEB;大量;不同;随机数
在一些应用中,需要产生大量的不同随机数,过去采用数组的方法只能产生少量的随机数,而且效率低下。当需要产生大于万级的不同随机数的时候,此类方法则无能为力。当前网络技术应用盛行的今天,特别是 INTERNET的快速发展,基于 WEB的应用程序由于其方便易用的特点而成为网络应用的一大趋势。各种基于 B/S模式的应用程序应运而生。此类程序的共同特点是:所有的WEB应用程序都安装在服务器端,客户端只需要安装W INDOWS自带的 IE浏览器,不需要再安装其它的程序,由于不需要安装客户端的专用程序而正逐渐成为网络应用的主流。其应用程序执行的过程是,客户端把请求通过 POST或 GET的方法传递给服务器端,该请求经服务器程序解释执行后以 HT ML的形式把执行结果显示于客户端。因此客户端只是发送请求和显示程序执行结果。正是由于应用程序全部由服务器完成,当需要产生大量的不同随机数时,由于所有的运算都在服务器端完成。如果不断的产生随机数并要求这些产生随机数不同,过多的运算很容易造成服务器的负载过重,使得服务器仅忙于应付这种运算,浪费资源和时间。更为重要的是,在报刊发行的数据抽样统计中,样本数几乎都是以万级来抽样的,这些以万级的样本数都要求是不同的,因此采用过去利用随机数组成数组的方法无能为力。本文通过数据库排序随机以及分段随机截取的方法有效的解决了此类问题。
1 产生不同随机数的常用方法及弊端
产生不同的随机数,最常见的方法是,利用随机函数在给定的范围内产生随机数,并使产生的随机数组成数组,以后每产生一个随机数都跟已有的数组元素做比较,如果数组中不存在,则加入到数组中,否则继续生成,由于每次都必须跟已有的数组元素逐个做比较,效率非常低下,当需要的不同随机数个数很多的时候,则无能为力了,因此此种方法仅能应用到只需要产生少量随机数的情况[1]。
在报刊发行中,经常需要对已有的数据做抽样统计和分析,而且需要抽取的数据尽量是随机的,满足统计学上的随机,由于报刊发行量都是很大,做一次小的抽样调查都往往需要以千次计算,尤其在WEB应用中的在线调查中,采用以上方法对服务器端的资源占用过大,增加了服务器的负荷,因此采用数组的方法是不可取的。
2 实现方法描述
以报刊发行为例,在报刊发行中,假设要抽取几万的用户做调查和统计,这些用户的选取必须是随机的。在抽取这些数据之前,这些用户的数据已经保存到数据库中,这些数据往往是按一定的顺序保存在其中的某个表中,假设数据库中的用户总量为n,如果要随机抽取其中的 i位用户,则只要产生一个随机数 r,该随机数满足 r+i<=n,截取其中的 r+i个用户,就实现了随机抽取的不同用户的结果,如图1所示。
图1 用户所有的记录数
用以上方法可以获取不同的随机数,其实现原理为[2]:首先利用随机函数生成一随机种子 r,其大小介于 1~n之间,该数同时满足 r+i<=n,其中 i为要抽取的随机数的个数,且 r+i<=n,因此实际上是在 1—n之间随机的截取 r+i这部分的不同数,由于 r是随机的,因此截取的这一段数据也就是随机的,从而实现了随机产生大量不同的随机数。但由于是分段截取的,因此每次产生的数的顺序是连在一起的,并不是真正意义上的随机,在一些应用中并不能满足需求,因此,如果在此之前先让数据库中的表的顺序随机排序,再在此基础上做上述截取,则很好的实现了真正意义上的随机,一次产生大量不同随机数的方法是:先使数据库中的表中记录随机,在此基础上再随机截取其中的某一段记录,从而获取了大量不同的随机数,而且效率高。
3 具体实现过程
3.1 实现数据库表中的数据随机
假设数据表名为 table,获取随机排序的 SQL语句可以这样书写[3]:
SELECT * FROM users ORDER BYRAND()LIMIT 1。
ORDER BY RAND()实现了对数据表随机排序的功能,这是 SQL语句的随机排序语法。但在实际测试中才发现这样书写效率非常低下。因为这样会导致数据列被多次扫描,在测试中发现,一个 15万余条的库,查询 5条数据,居然要 8秒以上,更不用说查询的数据更多。rand()放在 ORDER BY子句中会被执行多次,自然效率极低。
在基于WEB的应用程序中,由于程序在服务器端执行,这种扫描当然会给服务器带来巨大负荷,为了降低服务器的负荷,经过多次实验后采用如下代码:
以上语句中去掉了 ORDER BY RAND(),而加入了 join语法,从实际测试中发现,利用 sql本身的语法在执行效率上要比用 RAND()函数随机排序的效率高很多,在实际测试中,用上面的语句做 10次查询测试,所用的时间为 0.015100 s,这样就高效的实现了数据库中表的随机排序问题。
3.2 对产生的数据分段再排序
产生一定范围的随机数截取已经随机排序的数据表的一部分[4]:
total为数据表中所有的总记录数,yangnum为需要抽样的样本数,savevote函数把截取的各随机数保存到数据表 chouyang中,用以上方法实现了截取已经随机排序的记录中的一部分,由于排序随机和截取随机两方面的结合,很好高效的实现了大量产生不同随机数的结果。
4 算法分析
在此算法中,由于是经过数据库排序和截取两次随机,最大限度的实现了统计学意义上的随机,因此更好的保证了统计数据的准确性和可靠性,由于是基于WEB的应用,因此还要考虑对服务器的负荷尽可能的小,尤其是在WEB应用中多次产生大量不同随机数的时候,数据库随机排序的算法要尽可能的少占用服务器的资源,在实际的测试中,经过多次实验发现,采用在 sql语句中用 JO IN的语法比直接在WHERE中使用函数效率还要高很多。在分段截取算法中,由于实际上只是产生了一个随机数,因此不会对服务器造成大的负荷。在整个运算过程中,由于两个优化算法的两次随机,既满足了产生大量不同随机数的结果,也大大提高了整个应用的执行效率。
5 结束语
产生随机数的方法很多[5],但在 web应用中大量产生不同随机数的算法则要求特别,既要能实现产生大量不同随机数的结果,又要高效,并且对服务器的影响尽可能的小。在文中所论述的算法中,运用数据库随机排序和随机分段截取的方法,很好的满足了上述特殊要求,既产生了大量的不同随机数,也减少了对服务器的影响,而且产生的随机数满足了统计意义上的随机,对统计的科学性提供了技术保障。
[1] 李幼平.随机数的捕获及其基于WEB的应用[J].微电子学与计算机,2005,16(1):26-27.
[2] 赵雪峰.一种伪随机数生成算法的研究与实现 [J].电脑学习,2005(12):25-26.
[3] 计奎.利用 windows时间函数生成服从正态分布的随机数 [J].测绘信息与工程,2004,29(2):19-20.
[4] 林国顺,黄梯云.模拟随机数统计性质比较[J].数理统计与管理,2000(12):30-34.
[5] 吴飞.产生随机数的几种方法以及应用[J].数值计算与计算机应用,2006(1):48-51.
A large number of different random numbers application based WEB
LI You-ping
(Department of Computer and Information Engineering,Wuhan Polytechnic University,Wuhan 430023,China)
During applications based WEB,a large number of different random numbers are often needed,and the traditional use of the array to obtain the random numbers by different methods are inefficient. It is even more obvious when the number of requests is large,particularly in the WEB applications,where the client continues to request more easily server load and can not be completed.This article proposes an effective solution of such problems through a database of random numbers and random sub-combination of methods.
WEB;a large number of;different;random number
TP 311
A
1009-4881(2010)01-0064-03
10.3969/j.issn.1009-4881.2010.01.018
2009-09-11.
李幼平 (1973-),男,副教授,E-mail:jiss118@126.com.
教育部青年基金资助项目(06JC860005).