快速生产一定数量的不重复的随机数

来源:互联网 发布:动态跟踪算法 编辑:程序博客网 时间:2024/05/18 01:13

    在程序中,尤其在游戏程序中我们都会经常性使用到随机数。有时我们只需要生产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的程序,当然方法同样适合于别的语言。。

原创粉丝点击