在程序中,尤其在游戏程序中我们都会经常性使用到随机数。有时我们只需要生产1个在一定范围内的随机数。如a=int(rnd*100) 生成一个0~99之间的随机数。而有时我们会需要产生一批随机数,比如我们做有关扑克牌的游戏时,就需要将54张牌打乱然后分发出去。这就需要生产54个不重复的随机数。而这时我们就会遇到怎样防止重复的问题,如果用判断程序的话,越到后面就要做越多的判断,而且经常会需要生成很多次才会生成一个不重复的数。当然,如果是54个数的话,即使多花时间了,我们也感觉不出来,但如果是10000个,甚至更多呢?下面介绍一个比较高效的方法。
主要思想是引入一个辅助数组。比如我们要将0~99这100个数随机的存入res(0)~res(99)这个数组里,那我们就先定义个辅助数组temp(0)~temp(99),并使它依次等于0~99。而我们产生的随机数是指这个数组的下标而不是直接的数字。根据随机产生的下标提取辅助数组中的一个单元,并同时把这个单元用辅助数组的最后一个单元填上。下次取随机数的范围也跟着减少一个。如以下程序:
Dim res(99) As Integer '结果存放数组
Dim temp(99) As Integer '辅助数组
Dim lentemp As Integer '辅助寄存器长度
Dim i, a As Integer
For i = 0 To 99 '辅助数组依次存入0~99
temp(i) = i
Next i
lentemp = 100
Randomize
For i = 0 To 99
a = Int(Rnd * lentemp)
res(i) = temp(a)
temp(a) = temp(lentemp - 1)
lentemp = lentemp - 1
Next i
以上程序是VB6.0的程序,当然方法同样适合于别的语言。。