• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

返回列表 12345678» / 32
发新话题 回复该主题

[按键精灵安卓版] 激活码是怎么生成的? - 【201510期】 [复制链接]

1#

激活码是怎么生成的?


您所在的用户组无法下载或查看附件

本文按键学院提供技术支持


按键学院交流①群(已满):376122403

按键学院交流②群(已满):372671254

按键学院交流③群(快满):170084238

按键学院安卓①群:115768679


如今好游戏层出不穷,一个新游戏出来之前基本都需要各种封测内侧公测,并且测试人员十分有限,需要领取各种注册码激活码之类的东西,对于一个决定玩此游戏的玩家而言,越早了解游戏就能越在游戏正式上线时取得先机,那么问题来了,这些激活码之类的东西是怎么生产的?


您所在的用户组无法下载或查看附件


我们能想到的最直观的方法,就是使用随机数生成,这并没有错,但是应该使用什么方式来进行生成呢?我们知道,要生成随机数很简单,直接使用按键自带的命令就可以生成了:
  1. TracePrint Rnd()
复制代码
Rnd()产生一个0-1的随机浮点数(带小数点),我们可以进行简单的封装来获取一个区间内的随机整数:
  1. Function 生产随机数(i, j)
  2. 生产随机数 = CInt((j - i) * Rnd()) + i
  3. End Function
复制代码
好的,我们来思考一下,激活码一个无规律字符串,但是实际上我们可以理解为多进制的数,比如16进制中的a等于十进制10,所以,我们是可以将激活码当成数值的,无非就是进制问题。
我们尝试着从1-10中取5次随机数:
  1. For 5
  2. TracePrint 生产随机数(1, 10)
  3. Next
复制代码

您所在的用户组无法下载或查看附件


得出了5个随机数,但是这并不是我们想要的,因为他有重复了,试问一个激活码能重复吗?当然不行,那么我们就需要定义一个数组用来保存已经生成的数据,然后每生成一个就跟数组里的数进行比较,如果重复了就重新随机,不重复就添加进数组:
  1. Dim arr = Array()

  2. Function 获取数组长度(arr)
  3. Dim leng = 0
  4. For Each n In arr
  5. leng = leng+1
  6. Next
  7. 获取数组长度 = leng
  8. End Function

  9. Function 生产随机数(i, j)
  10. 生产随机数 = CInt((j - i) * Rnd()) + i
  11. End Function

  12. Function 随机数生产并加入数组(i, j)
  13. Dim 标志位 = true
  14. Dim 随机数
  15. Do
  16. 随机数 = 生产随机数(i, j)
  17. // TracePrint "随机生成了:"&随机数生产
  18. For Each n In arr
  19. If 随机数 = n Then
  20. 标志位 = false
  21. // TracePrint "重复了,重新申请"
  22. Exit For
  23. Else
  24. 标志位 = true
  25. End If
  26. Next
  27. If 标志位 = true Then
  28. Exit Do
  29. End If
  30. Loop
  31. arr(获取数组长度(arr)) = 随机数
  32. End Function


  33. Dim 抽取个数 = 10
  34. Dim 总个数 =100

  35. Function 方法1()
  36. Dim MyTime = TickCount()
  37. For 抽取个数
  38. 随机数生产并加入数组(1,总个数)
  39. Next
  40. TracePrint "方法1耗时为(毫秒):"&(TickCount() - MyTime)
  41. End Function

  42. Call 方法1()
复制代码

接下来,将得到的数组输出即可:
  1. For Each n In arr
  2. TracePrint n
  3. Next
复制代码

这种方法从逻辑上非常好理解,经过调试之后发现确实生成了不重复的随机数,但是当我们随机的数据越多,重复率就越高,耗时成倍增长,尝试着将区间改成1-100000,取10000个不重复随机数试试,会发现耗时接近10秒,因此如果用来做大量的数据这方法并不适用,那么还有其他办法吗?当然是有的,我们可以通过设定随机的区间来去除检测重复的耗时,举个例子,如果我需要在1-9中取3个随机不重复数,我可以事先将1-9分为三个区域,1-3、4-6、7-9,然后分别在这三个区间内取随机数,这样得到的数就不会重复,至于随机出来的数的顺序,我们随机打乱一下就好了,我们按照这种思路来写写看:
  1. Function 方法2()
  2. Dim MyTime = TickCount()
  3. Dim 区间大小 = 总个数/抽取个数
  4. For i = 0 To 抽取个数-1
  5. arr(i) = 生产随机数(1,区间大小)+i*区间大小
  6. Next
  7. 打乱顺序(arr,抽取个数)
  8. TracePrint "方法2耗时为(毫秒):"&(TickCount() - MyTime)
  9. End Function

  10. Function 打乱顺序(arr, count)
  11. Dim index,tmp,i
  12. For i = 0 To count
  13. index = Rnd() * (count - i) + i
  14. If index <> i Then
  15. tmp=arr(i)
  16. arr(i)=arr(index)
  17. arr(index)=tmp
  18. End If
  19. Next
  20. End Function

  21. Call 方法2()
复制代码

如果在1-10区间取数,基本分不出速度,但是如果我们从1-100000中取1000个数来试试:

您所在的用户组无法下载或查看附件





可以发现,后一种方式的速度非常快,并且耗时速度的增长很稳定,比起方法1要好得多。但是缺点也有,就是随机的范围比较固定,解决办法就是采用弹性的区间,这里我提供思路,你们可以尝试自己写出来哦,我们还是以1-9取三个数为例,我们允许区间有1的弹性,比如第一个区间1-3,我们允许有1的弹性就变成1-4,我们取一个随机数,比如得到了1,那么接下来的区间就产生变化,需要在2-9内取2个数,于是第二个数的区间应该是2-5,允许1的弹性后是2-6,比如取到了3,那么接下来的区间就是4-9(弹性在最后一个区间无效),我们再取一个随机数。这样我们就实现了具备弹性的随机数。

您所在的用户组无法下载或查看附件







    已有2评分我要评分查看所有评分

    最后编辑兄弟工程师13 最后编辑于 2015-10-20 17:07:56
    本主题由 超级版主 瑞祥幽冥狼 于 2023/6/24 8:28:57 执行 审核帖子 操作
    2#


    接脚本定制
    QQ :931589898
    ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆——南宫泷
    3#

    学习了

    4#

    是我们想要的,因为他有重复了,试问一个激活码能重复吗?当然不行,那么我们就需要定义一个数组用来保存已经生成的数据,然后每生成一个就跟数组里的数进

    5#


    6#

    都是错误的 写个毛线

    7#

    学习下 啊

    8#

    这需要回复是也太多了吧 大神

    9#

    9999999999999999999999999

    10#


    11#

    REEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

    12#

    顶顶顶顶

    13#

    看看…………。

    14#

    方式的速度非常快,并且耗时速度的增长很稳定,比起方法1要好得多。但是缺点也有,就是随机的范围比较固定,解决办法就是采用弹性的区间,这里我提供思路,你们可以尝试自己写出来哦,我们还是以1-9取三个数为例,我们允许区间有1的弹性,比如第一个区间1-3,我们允许有1的弹性就变成1-4,我们取一个随机数,比如得到了1,那么接下来的区间就产生变化,需要在2-9内取2个数,于是第二个数的区间应该是2-5,允许1的弹性后是2-6,比如取到了3,那么接下来的区间就是4-9(弹性在最后一个区间无效),我们再取一个随机数。这样我们就实现了具备弹性的随机数。

    15#

    学习

    16#


    &lt;iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=298 height=52 src=&quot;//music.163.com/outchain/player?type=3&amp;id=787411603&amp;auto=1&amp;height=32&quot;&gt;&lt;/iframe&gt;
    17#

    区间法 待我想想应用场景哈!

    WWW.92AJ.CN
    承接中小型 游戏/办公/投票/自动发货类 脚本
    如果回答对你有所帮助请不要吝啬手中的鲜花
    18#


    19#

    11111111111111

    20#


    发新话题 回复该主题