如何在VB中灵活运用随机函数和时间函数
在VB中,Randomize后可带参数 [Number]或任意数字表达式:
格式:Randomize [Number],假如Randomize后不带任何参数和表达式,那么初始值将自动由VB的Timer函数(时间函数)提供,这样用Rnd函数来取随机数时,就不会出现相同的随机数序列;而Timer也是VB所特有一个函数,它的作用是返回12:00AM(午夜)后所经过的秒数,假如现在时间是8:10:30AM,那么它的返回值就是8*3600+10*60+30=29430。
由于VB中没有Quick Basic或Turbo Basic的SLEEP(休眠)函数,我们在程序设计中虽然可以用VB的Timer控件(与Timer函数不同)来控制程序的延时运行,但是Timer控件有一个缺点,就是须CPU抢先为其执行,从而使CPU腾不出时间来处理其它正在运行的程序,在多个Timer控件同时运行时,这种缺点尤其明显。幸好VB允许我们自定义函数,这样我们可以(在Module全局模中)自定义SLEEP延时函数了:
Function Sleep(x as integer)
Dim StarTime as Single
StartTime=TimerDO Until (Timer-StarTime)>X
Loop
End Sub
使用时只要在程序中别入Sleep语句和Timer函数结合起来,再用一条取值公式:INT(upper-lower+1)*Rnd+lower)(upper是取数范围的最大数,lower是取数范围的最小数),可取得指定范围的随机整数。以下例子就是模拟掷骰子来产生1到6之间的随机数:
Private Sub Picturel_Click()
DIm S(6) as Integer '定义数组
Randomize '以Timer为种子取随机数
For i=1 to 6 '取6个随机数
S(i)=Int(6-1+1)*Rnd+1 '取1至6之间的随机数
Picturel.Print "xlhS("xlh&i&"xlh)="xlh,S(i) '在图片框中打印出随机数
Sleep(1) '停留1秒
Next i
End Sub
但是,有时我们所需的是比较大范围而且又不允许出现相同的随机数字的序列的时候,可参考以下这个例子:(模拟取得52张扑克牌和知道它们的花色、点数)
(在Module全局模块中输入以下语句)
Global Card(52),CardDS(52),CardHS(52) as Integer '定义扑克牌的数组
Function CardNuber() as Ingeger '自定义CardNuber函数
Randomize '以Timer为种子取随机数
CardNuber=Int(51-0+1)*Rnd+0) 'CardNuber取0到51之间的随机数
End Function
Sub QCard () '求扑克牌的子程序
For i=1 to52 '取52张扑克牌
10 NB=CardNuber
'取CardNuber函数的值赋给临时变量NB
For j=1 to I '扦环i次
While NB=Card(i)
'判断NB的值是否与已发的第i张牌相同
Goto 10 '相同则转向第10行语句
Wend
Next jCard(i)=NB '把变量NB的值赋值给第i张扑克牌
CardDS(i)=Card(i) DIV 4+1 '计算第i张扑克牌的点数值并赋给CradDS(i)
CardHS(i)=Card(i) Mod 4
'计算第i张扑克牌的花色值并赋给CardHS(i)
Next i
End Sub
说明:在上例中,把随机数范围定义为0至51是因为方便点数的判断和花色的取模运算,52个随机数分为每四个数1组,共13组(扑克牌中的A、2、3……到K),取模时(0,1,2,3)为扑克牌四种花色(黑桃,红桃,梅花,方块)。随机数(0,1,2,3)为A的四张牌(黑桃,红桃,梅花,方块),随机数(4,5,6,7)为2的四张牌(黑桃,红桃……),……如此类推到随机数(48,49,50,51)K的四张牌(黑桃,红桃,梅花,方块),在计算扑克牌的点数值时采用整除4加1的算法,如当Card(i)的值是2时,CardDS(i)值于1(即A),取模时CardHS(i)等于2(梅花),也就是说Card(i)这张牌是梅花A……如此类推。
在掌握了随机函数和时间函数后,我们就可以很方便地利用VB设计一些程序或游戏了。