一、隨機函數Rand()的特性
VFP中的隨機函數為Rand( ):格式:Rand(m),其中m為參數,它決定了函數返回的數值序列,可省略。功能:返回0到1間的隨機數。特性:參數m的取值不同,Rand( )函數返回結果就不同。
上機驗證:在VFP 命令窗口中重執行10次:?Rand(m)。不改變m值,重新啟動VFP再重復執行10次(目的是檢驗隨機數序列的變化),得到結果見表1。
由表1中產生的隨機數情況可以看出:當m<0時,函數Rand(m)將使用系統時鐘的種子值,產生不重復的隨機數序列。當m>0時,函數Rand(m)將產生序列重復的固定值。當m=0時,函數Rand(0) 將產生序列不重復的變量值。當m省略時,函數Rand( ) 將產生序列重復的有一定規律的數值。值得注意的是參數m省略時,產生偽隨機數。應用中要謹慎采用。m為負數時產生的隨機數,類似VB中加Randomize語句產生的隨機數,在此稱真隨機數,可廣泛應用。
二、應用隨機函數事例
設計一個用于歌手大獎賽產生評委的隨機抽取程序。
1.程序設計思路。首先建立一個存放評委情況的初始表csb.dbf,并將評委基本情況輸入表中。然后建立一個存放被選中評委的結果表(jgb.dbf結構同初始表)。建立顯示結果的表單。在表單上添加一個命令按鈕。編寫命令按鈕的單擊事件。運用隨機函數產生隨機號,將初始表中對應的記錄抽取出來,保存在結果表中,最后顯示在表單上。
2.建立兩個自由表、一個顯示結果表單。
csb.dbf和jgb.dbf表結構:
建立一個表單form1,在表單上添加10個標簽,Name屬性分別為:label10、label11、label12、 label13、 label14、 label15 、label16 、label17、 label18、 label19 將每個標簽的Backstyle屬性設為:0—透明。添加一個命令按鈕command1并將其Caption屬性設為:“開始抽取”
3.編寫命令按鈕單擊事件中的小程序
close all
set excl on
set exac on
set safe off
release all
sele 2
use csb exclusive
sele 1
use jgb exclusive
zap
產生隨機數
dime a(10)
a=0
i=1
do while i<=10 在50位中抽取10位作為現場評委
ww=int(rand(-1)*50+1) 初始表中假設有50位評委
if ww=0
loop
else
if ascan(a,ww)=0
a(i)=ww
i=i+1
endif
endif
enddo
ww=0
將被抽中的評委追加到結果表中
for j=1 to 10
appe from csb for alltrim(編號)=alltrim(str(a(j),4))
next
j=1
顯示成員
repl all 編號 with str(recno(),4)
go top
u=10
scan for not eof()
s=str(u,2)
thisform.labels..caption=姓名
u=u+1
endscan
close all
在csb.dbf表中添加50條記錄,運行表單,計算機將自動隨機抽取出10名評委。如果將rand(m)函數中的m省略,那么運行表單后,產生的評委在序列上有一定規律可循,也就是說產生的評委不具隨機性,進而失去了計算機隨機抽取的意義。實踐中應該引起注意。
參考文獻:
史濟民 湯觀全:Visual Foxpro及其應用系統開發[M].北京:清華大學出版社,2000