魔兽地图编辑器吧 关注:65,685贴子:3,845,820

[算法]不重复随机数的生成算法合集

只看楼主收藏回复

RPG地图往往需要大量的随机数来增加游戏的娱乐性,而我也知道吧内并不是所有人都有编程基础,在这里列出几个好的随机算法思路大概会对吧友们有帮助吧。


IP属地:广东来自Android客户端1楼2019-02-22 11:45回复


    IP属地:上海2楼2019-02-22 11:46
    回复
      2026-01-30 07:38:49
      广告
      不感兴趣
      开通SVIP免广告
      目录
      1.调换法——大小范围通用
      2.随机排序法——同上
      3.对称法——大范围最好
      4.排序删除法——超大范围不重复字符串
      5.格子放置法——小范围选取
      6.二进制法——小范围选取不定量
      7.羊圈法——通用
      8.叠加法——通用
      9.人品人品法 ——适合选两个
      名字乱起的。


      IP属地:广东来自Android客户端3楼2019-02-22 11:48
      回复
        随机排序法
        思路和调换法差不多。
        只是这次我们不再抽取,而是将数组打乱,然后直接选取数组中的012三个单元作为抽取结果。
        思路大概是:
        循环整数A 0到4
        random=随机整数 从循环整数A 到5
        设置x=unit[循环整数A]
        unit[循环整数A]=unit[random]
        unit[random]=x
        (这里做一个数值交换)
        循环end
        结果为unit[0]到unit[2]
        推荐程度:⭐⭐⭐⭐⭐
        代码复杂程度:⭐⭐⭐
        算法通用程度:⭐⭐⭐⭐⭐


        IP属地:广东来自Android客户端5楼2019-02-22 11:59
        回复
          对称法
          超简单。就是把n个元素绑定到一起。比如说6个抽2个。0和5绑一起 1和4绑一起 2和3绑一起,那样只需要抽一次,也就无需考虑它重不重复了。优点就是代码简单,缺点是随机结果比较的单一,组合固定。
          推荐程度:⭐⭐
          代码复杂程度:⭐
          算法通用程度:⭐⭐⭐


          IP属地:广东来自Android客户端6楼2019-02-22 12:04
          回复
            排序删除法
            主要用于生成大量等长随机字符串,且不重复。需要用到字符串排序算法(我不知道we有没有,反正java是有的)
            我们就以字符串来说吧。首先设定一个数组,内含你所需要生成的字符。比如arry[0]=a arry[1]=b等等,我们这里就只生成小写字母,所以数组长度是26,最大值是25。
            假如要生成100条长度为10的随机字符串。
            每一条的生成都将是一个循化。
            循环 0到9
            随机整数random=从0到25的一随机数。
            result=字符串连接(result+arry[random])
            循环end
            我们要100条数据,就将上述算法循化个105次,获得了一个长度为105的字符串数组result(为什么是105次呢,因为这其中有可能会有重复的,我们需要去掉其中一些。)
            如何去掉?这里要用到字符串排序。
            何谓字符串排序?首先大家需要明白字符串比较的原理:就是将字符串按字符一个个比较,比较其ASCII码,不懂没关系,只要知道a最小,z最大就完了。比如两串字符串sccccccccc和zxxxxxxx,谁更大?结果是后者大。算法会从第一个字符开始比较,如果字母不相同,就会输出结果,至于后面是什么它压根不管,否则的话才会比较后一位。也就是说,字符串再长是没有用的,字母大才是关键。
            明白了之后,我们就需要知道字符串排序方法了——将字符串逐个比较,将小字符串放在数组的前端,将大字符串放在数组的后端。举个例子就是axx baa bab bab....zzz
            是的,大家会发现运气不好的时候,字符串是会出现重复的,概率十分小,但是就是有会出现。怎么办,这时候把这个result数组前后比较,0和1比 1和2比一直比到103-104。
            如果不相等就不管,相等,就把后一个删除,将后面的所有元素挪前一位,不要觉得这样很蠢,当数据量巨大(100w条以上)的时候这个方法是很快的,时间复杂度是n。
            最后剩余的可能会是103、104条那样(事实上基本不会出现删除)取前100条就好了。
            推荐程度:⭐⭐
            代码复杂程度:⭐⭐⭐⭐⭐
            算法通用程度:⭐⭐


            IP属地:广东来自Android客户端7楼2019-02-22 12:37
            回复
              哼╭(╯^╰)╮没人看我就不写吗,想得美,我就要写,写死你们


              IP属地:广东来自Android客户端8楼2019-02-22 12:39
              回复


                来自Android客户端9楼2019-02-22 12:45
                回复
                  2026-01-30 07:32:49
                  广告
                  不感兴趣
                  开通SVIP免广告
                  太麻烦 不如indexer系统


                  10楼2019-02-22 12:46
                  收起回复
                    格子放置法
                    5选3,除了预设随机单位数组unit以外,还需要预设一个结果数组result,长度和随机单位数组一样,这里是5。
                    我们想象result数组是一排格子。我们随机出来一个数,就把结果往格子里面放。万一重复了,那么就往格子后面移,就是+1再求余,直到后面有位置给它放为止。很简单对吧。
                    推荐程度:⭐⭐⭐⭐
                    代码复杂程度:⭐⭐
                    算法通用程度:⭐⭐⭐⭐


                    IP属地:广东来自Android客户端11楼2019-02-22 12:48
                    回复
                      休息一下 ,妈的,累死了。30楼都到不了发话后面的咕咕了。


                      IP属地:广东来自Android客户端12楼2019-02-22 12:52
                      回复
                        ??????


                        IP属地:广东来自Android客户端14楼2019-02-22 13:09
                        收起回复
                          帮顶~~


                          IP属地:湖南15楼2019-02-22 13:26
                          回复
                            好麻烦,魔兽自带的够了。。反正真随机也不好玩。


                            IP属地:广西来自Android客户端16楼2019-02-22 21:19
                            回复