论坛上问这个问题的人蛮多,最近正好也在写一个小东西遇上了这个问题,在网上搜索了下没找到解决办法。最后在Access版的老大们帮助下解决了,有兴趣的可以交流一下。
SQL server数据库有个NewID函数,可以很方便的用SQL语句得到数据表中的随机数据。但Access数据库没这么方便,虽然有个Rnd,可以通过“select top 10 * from tb order by rnd(id)”得到随机数据,VBA环境下使用没有问题,可惜在VB中使用,产生的随机序列是一样的,每次调用返回的数据相同。
有人说在程序中加上Randomize初始化随机种子,那么这只说对了一半,在程序中简单的加上Randomize,是没作用的,道理很简单,Randomize不可能影响SQL语句中的Rnd,这个Rnd只不过是个字符串,SQL语句是通过数据库引擎去执行的,正因为如此,无法初始化种子,致使每次应用产生的随机序列是一样的。
由此可见,解决问题的关键就是如何初始化随机种子。Rnd函数语法是Rnd(number),它有一个特性,就是如果使用了负参数的number,那么就会产生一个固定的随机序列。利用这个特性,我们的问题就迎刃而解了,这就是每次调用Rnd函数时,使用一个负的不同的number,从而达到产生不同随机序列的目的。经过测试,问题解决。示例代码如下:
'......
Dim sql As String
Dim r As Single
Randomize
r = Rnd