李幼平
(武漢工業(yè)學(xué)院計算機與信息工程系,湖北武漢 430023)
WEB應(yīng)用中產(chǎn)生大量不同隨機數(shù)的方法
李幼平
(武漢工業(yè)學(xué)院計算機與信息工程系,湖北武漢 430023)
在計算機應(yīng)用中,很多時候需要大量產(chǎn)生不同隨機數(shù),傳統(tǒng)的利用數(shù)組獲取不同隨機數(shù)的方法效率低,在隨機數(shù)要求大量時更顯得無能為力,尤其在WEB應(yīng)用中,客戶端的不斷請求很容易加大服務(wù)器的負荷而無法完成,本文通過數(shù)據(jù)庫排序隨機與隨機數(shù)分段相結(jié)合的方法,有效的解決了此類問題。
WEB;大量;不同;隨機數(shù)
在一些應(yīng)用中,需要產(chǎn)生大量的不同隨機數(shù),過去采用數(shù)組的方法只能產(chǎn)生少量的隨機數(shù),而且效率低下。當需要產(chǎn)生大于萬級的不同隨機數(shù)的時候,此類方法則無能為力。當前網(wǎng)絡(luò)技術(shù)應(yīng)用盛行的今天,特別是 INTERNET的快速發(fā)展,基于 WEB的應(yīng)用程序由于其方便易用的特點而成為網(wǎng)絡(luò)應(yīng)用的一大趨勢。各種基于 B/S模式的應(yīng)用程序應(yīng)運而生。此類程序的共同特點是:所有的WEB應(yīng)用程序都安裝在服務(wù)器端,客戶端只需要安裝W INDOWS自帶的 IE瀏覽器,不需要再安裝其它的程序,由于不需要安裝客戶端的專用程序而正逐漸成為網(wǎng)絡(luò)應(yīng)用的主流。其應(yīng)用程序執(zhí)行的過程是,客戶端把請求通過 POST或 GET的方法傳遞給服務(wù)器端,該請求經(jīng)服務(wù)器程序解釋執(zhí)行后以 HT ML的形式把執(zhí)行結(jié)果顯示于客戶端。因此客戶端只是發(fā)送請求和顯示程序執(zhí)行結(jié)果。正是由于應(yīng)用程序全部由服務(wù)器完成,當需要產(chǎn)生大量的不同隨機數(shù)時,由于所有的運算都在服務(wù)器端完成。如果不斷的產(chǎn)生隨機數(shù)并要求這些產(chǎn)生隨機數(shù)不同,過多的運算很容易造成服務(wù)器的負載過重,使得服務(wù)器僅忙于應(yīng)付這種運算,浪費資源和時間。更為重要的是,在報刊發(fā)行的數(shù)據(jù)抽樣統(tǒng)計中,樣本數(shù)幾乎都是以萬級來抽樣的,這些以萬級的樣本數(shù)都要求是不同的,因此采用過去利用隨機數(shù)組成數(shù)組的方法無能為力。本文通過數(shù)據(jù)庫排序隨機以及分段隨機截取的方法有效的解決了此類問題。
產(chǎn)生不同的隨機數(shù),最常見的方法是,利用隨機函數(shù)在給定的范圍內(nèi)產(chǎn)生隨機數(shù),并使產(chǎn)生的隨機數(shù)組成數(shù)組,以后每產(chǎn)生一個隨機數(shù)都跟已有的數(shù)組元素做比較,如果數(shù)組中不存在,則加入到數(shù)組中,否則繼續(xù)生成,由于每次都必須跟已有的數(shù)組元素逐個做比較,效率非常低下,當需要的不同隨機數(shù)個數(shù)很多的時候,則無能為力了,因此此種方法僅能應(yīng)用到只需要產(chǎn)生少量隨機數(shù)的情況[1]。
在報刊發(fā)行中,經(jīng)常需要對已有的數(shù)據(jù)做抽樣統(tǒng)計和分析,而且需要抽取的數(shù)據(jù)盡量是隨機的,滿足統(tǒng)計學(xué)上的隨機,由于報刊發(fā)行量都是很大,做一次小的抽樣調(diào)查都往往需要以千次計算,尤其在WEB應(yīng)用中的在線調(diào)查中,采用以上方法對服務(wù)器端的資源占用過大,增加了服務(wù)器的負荷,因此采用數(shù)組的方法是不可取的。
以報刊發(fā)行為例,在報刊發(fā)行中,假設(shè)要抽取幾萬的用戶做調(diào)查和統(tǒng)計,這些用戶的選取必須是隨機的。在抽取這些數(shù)據(jù)之前,這些用戶的數(shù)據(jù)已經(jīng)保存到數(shù)據(jù)庫中,這些數(shù)據(jù)往往是按一定的順序保存在其中的某個表中,假設(shè)數(shù)據(jù)庫中的用戶總量為n,如果要隨機抽取其中的 i位用戶,則只要產(chǎn)生一個隨機數(shù) r,該隨機數(shù)滿足 r+i<=n,截取其中的 r+i個用戶,就實現(xiàn)了隨機抽取的不同用戶的結(jié)果,如圖1所示。
圖1 用戶所有的記錄數(shù)
用以上方法可以獲取不同的隨機數(shù),其實現(xiàn)原理為[2]:首先利用隨機函數(shù)生成一隨機種子 r,其大小介于 1~n之間,該數(shù)同時滿足 r+i<=n,其中 i為要抽取的隨機數(shù)的個數(shù),且 r+i<=n,因此實際上是在 1—n之間隨機的截取 r+i這部分的不同數(shù),由于 r是隨機的,因此截取的這一段數(shù)據(jù)也就是隨機的,從而實現(xiàn)了隨機產(chǎn)生大量不同的隨機數(shù)。但由于是分段截取的,因此每次產(chǎn)生的數(shù)的順序是連在一起的,并不是真正意義上的隨機,在一些應(yīng)用中并不能滿足需求,因此,如果在此之前先讓數(shù)據(jù)庫中的表的順序隨機排序,再在此基礎(chǔ)上做上述截取,則很好的實現(xiàn)了真正意義上的隨機,一次產(chǎn)生大量不同隨機數(shù)的方法是:先使數(shù)據(jù)庫中的表中記錄隨機,在此基礎(chǔ)上再隨機截取其中的某一段記錄,從而獲取了大量不同的隨機數(shù),而且效率高。
假設(shè)數(shù)據(jù)表名為 table,獲取隨機排序的 SQL語句可以這樣書寫[3]:
SELECT * FROM users ORDER BYRAND()LIMIT 1。
ORDER BY RAND()實現(xiàn)了對數(shù)據(jù)表隨機排序的功能,這是 SQL語句的隨機排序語法。但在實際測試中才發(fā)現(xiàn)這樣書寫效率非常低下。因為這樣會導(dǎo)致數(shù)據(jù)列被多次掃描,在測試中發(fā)現(xiàn),一個 15萬余條的庫,查詢 5條數(shù)據(jù),居然要 8秒以上,更不用說查詢的數(shù)據(jù)更多。rand()放在 ORDER BY子句中會被執(zhí)行多次,自然效率極低。
在基于WEB的應(yīng)用程序中,由于程序在服務(wù)器端執(zhí)行,這種掃描當然會給服務(wù)器帶來巨大負荷,為了降低服務(wù)器的負荷,經(jīng)過多次實驗后采用如下代碼:
以上語句中去掉了 ORDER BY RAND(),而加入了 join語法,從實際測試中發(fā)現(xiàn),利用 sql本身的語法在執(zhí)行效率上要比用 RAND()函數(shù)隨機排序的效率高很多,在實際測試中,用上面的語句做 10次查詢測試,所用的時間為 0.015100 s,這樣就高效的實現(xiàn)了數(shù)據(jù)庫中表的隨機排序問題。
產(chǎn)生一定范圍的隨機數(shù)截取已經(jīng)隨機排序的數(shù)據(jù)表的一部分[4]:
total為數(shù)據(jù)表中所有的總記錄數(shù),yangnum為需要抽樣的樣本數(shù),savevote函數(shù)把截取的各隨機數(shù)保存到數(shù)據(jù)表 chouyang中,用以上方法實現(xiàn)了截取已經(jīng)隨機排序的記錄中的一部分,由于排序隨機和截取隨機兩方面的結(jié)合,很好高效的實現(xiàn)了大量產(chǎn)生不同隨機數(shù)的結(jié)果。
在此算法中,由于是經(jīng)過數(shù)據(jù)庫排序和截取兩次隨機,最大限度的實現(xiàn)了統(tǒng)計學(xué)意義上的隨機,因此更好的保證了統(tǒng)計數(shù)據(jù)的準確性和可靠性,由于是基于WEB的應(yīng)用,因此還要考慮對服務(wù)器的負荷盡可能的小,尤其是在WEB應(yīng)用中多次產(chǎn)生大量不同隨機數(shù)的時候,數(shù)據(jù)庫隨機排序的算法要盡可能的少占用服務(wù)器的資源,在實際的測試中,經(jīng)過多次實驗發(fā)現(xiàn),采用在 sql語句中用 JO IN的語法比直接在WHERE中使用函數(shù)效率還要高很多。在分段截取算法中,由于實際上只是產(chǎn)生了一個隨機數(shù),因此不會對服務(wù)器造成大的負荷。在整個運算過程中,由于兩個優(yōu)化算法的兩次隨機,既滿足了產(chǎn)生大量不同隨機數(shù)的結(jié)果,也大大提高了整個應(yīng)用的執(zhí)行效率。
產(chǎn)生隨機數(shù)的方法很多[5],但在 web應(yīng)用中大量產(chǎn)生不同隨機數(shù)的算法則要求特別,既要能實現(xiàn)產(chǎn)生大量不同隨機數(shù)的結(jié)果,又要高效,并且對服務(wù)器的影響盡可能的小。在文中所論述的算法中,運用數(shù)據(jù)庫隨機排序和隨機分段截取的方法,很好的滿足了上述特殊要求,既產(chǎn)生了大量的不同隨機數(shù),也減少了對服務(wù)器的影響,而且產(chǎn)生的隨機數(shù)滿足了統(tǒng)計意義上的隨機,對統(tǒng)計的科學(xué)性提供了技術(shù)保障。
[1] 李幼平.隨機數(shù)的捕獲及其基于WEB的應(yīng)用[J].微電子學(xué)與計算機,2005,16(1):26-27.
[2] 趙雪峰.一種偽隨機數(shù)生成算法的研究與實現(xiàn) [J].電腦學(xué)習(xí),2005(12):25-26.
[3] 計奎.利用 windows時間函數(shù)生成服從正態(tài)分布的隨機數(shù) [J].測繪信息與工程,2004,29(2):19-20.
[4] 林國順,黃梯云.模擬隨機數(shù)統(tǒng)計性質(zhì)比較[J].數(shù)理統(tǒng)計與管理,2000(12):30-34.
[5] 吳飛.產(chǎn)生隨機數(shù)的幾種方法以及應(yīng)用[J].數(shù)值計算與計算機應(yīng)用,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).