Visual FoxPro 3.0中自编随机数函数

Author: 闫东 Date: 1997-01-01

  在测试程序、模拟程序中,常常要使用随机数,这就需要有一个产生随机数的函数。但在Visual FoxPro 3.0中却没有类似的函数,这无疑给编程带来很大的困难。为解决这一问题笔者自编了一个用于Visual FoxPro 3.0的随机函数──RND()。
  为得到随机数,首先要有一个快速变化的数据源,笔者想到了Windows 95的API函数TimeGetTime,此函数返回Windows 95启动开始已逝去的毫秒数,其值以毫秒级发生变化,这个条件显然是满足的;其次,要求随机数的每一位数的变化都要很快,至少是前几位数的变化要快,但用TimeGetTime得到的随机数正好相反(最后一位以毫秒级变化,前几位却几秒甚至几十秒才变化一次),于是笔者以使用Visual FoxPro 3.0的STR()和LEFT()函数将TimeGetTime的返回值调个头,如此一来便可以满足随机数的要求了。
  程序设计中使用FoxTools.FLL库中的RegFn()函数和CallFn()函数来调用TimeGetTime函数。下面的一段程序可产生100个1到100之间的随机数:
  Set Talk Off
  For I=1 To 100
  ?Int(Rnd()*100)+1
  EndFor
  Function RND
  Set Decimals To 8
  Set Library To C:\VFP\FOXTOOLS.FLL
  SysTime=Regfn("TimeGetTime","","I","MMSYSTEM")
  Ss=Callfn(SysTime)
  RndS=Val("0."+Right(Str(Abs(Ss)),1)+
  Left(Right(Str(Abs(Ss)),2),1)+
  Left(Right(Str(Abs(Ss)),3),1)+
  Left(Right(Str(Abs(Ss)),4),1)+
  Left(Right(Str(Abs(Ss)),5),1))
  Return(Rnds)
  以上程序在Windows 95和Visual FoxPro 3.0中运行通过。