前兩天看到有人要編個考試系統,當時只是簡單回了下用隨機函數RND
實際一般需要從資料庫中隨機提取N道題目。
以下代碼都基於VBS;
通常的編寫類似這樣的
'產生不重複隨機數 function rndarray(istart,iend,sum) dim arrayid(),i,j,blnre,temp,iloop,eloop redim arrayid(sum-1) i=0 iloop=0 eloop=0 blnre=false randomize do while i<sum temp=int(rnd*(iend-istart+1)+istart) if i=0 then arrayid(0)=temp i=i+1 iloop=iloop+1 else for j=0 to i-1 if arrayid(j)=temp then blnre=true iloop=iloop+1 exit for'這一句很重要,防止多餘的迴圈 else iloop=iloop+1 end if next if blnre=false then arrayid(i)=temp i=i+1 else blnre=false end if end if eloop=eloop+iloop iloop=0 loop rndarray=join(arrayid)&"迴圈次數:"&eloop end function response.write rndarray(1,10,5)&"<br>"'調用過程 |
PS。其中的iloop、eloop是為了計算迴圈次數而已。
以上,大多數人的都是用這種方法編寫的,產生一個隨機數,然後再和以前產生的做比較,判斷是否可用;
但這不是一種AI的,或者說有效率的方法,為什麼不用兩個數組呢?
數組1,存放需要的字串,或數字等,數組2存放產生的隨機數;當每次隨機產生中間變數temp的一個下標x,賦給數組2,然後從數組1中,去掉下標為x的數字,賦給中間變數temp;這樣每產生一個隨機數,就從數組1中拿掉這個數,下次再產生一個數就不會重複了,這種產生隨機數的方法原理實際是從數組1中提取。
方法二
function rndstr(istart,iend,isum) dim i,j,vntarray() redim vntarray(iend-istart) j=istart for i=0 to iend-istart vntarray(i)=j j=j+1 next dim vntarray2(),temp,x,y redim vntarray2(isum-1) y=iend-istart+1 x=0 temp=vntarray do while x<isum dim a randomize vntarray2(x)=temp(int(rnd*y)) a=" "&vntarray2(x)&" " temp=split(trim(replace(chr(32)&join(temp)&chr(32),a," "))) x=x+1 y=y-1 loop rndstr=join(vntarray2) end function response.write rndstr(1,5,2) |
這樣,是不是更簡單呢
展開一下,假如要產生隨機字串,包含字母數字時,僅需為數組1賦值時,用函數chr(num);
假設,需要做一個手機中獎的頁面程式。
首先把值賦給數組1,可以130....~139....迴圈賦值,當然實際使用時從資料庫中把已有的賦值,然後再隨機提取賦給數組2;
最後,再修飾一下
temp=replace(join(array2),chr(32),"") phone=left(temp,6)&"***"&right(temp,2) |
得到類似137648***58的結果,呵呵
寫那麼多,累死了~~