• 新浪微博:
  • 微信 :
按键精灵电脑版
立即下载

软件版本:2014.05
软件大小:21.6M
更新时间:07-04

按键精灵安卓版
立即下载

软件版本:3.3.0
软件大小:62.5M
更新时间:5-24

按键精灵iOS版
立即下载

软件版本:1.3.3
软件大小:29.2M
更新时间:06-14

按键精灵Mac版
立即下载

软件版本:1.1.0
软件大小:12.3M
更新时间:12-29

快捷导航

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

登录 注册
发新话题 回复该主题

[源码分享] 分享生成随机且不重复的数字数组 [复制链接]

1#
// 碰巧要用到生成随机不重复的数字数组 在论坛找了然而并没找到手机助手可以使用的的代码于是我自己写了一些
// 我本人也是菜鸟所以这些方法只是提供新手或者没思路的键友一些思路不保证我的方法是最好的,老鸟勿喷
// 如果你有更好的方法或者发现我的错误欢迎回帖。

第一个方法是我发帖时最初用的方法。后来看了键友的回帖,要生成10000个随机不重复的数字。于是我用第一个方法测试了下生成10000个随机数发
现等了N秒都没算出来,然后,我又用第一个方法试了生成500个随机数要1秒左右,发现大范围的生成随机数效率确实较低。

第二种方法,是最近在学习其他脚本语言的时候偶然得到了启发,我于是把上面的方法进行调整修改。第二种方法修改了判断方式,经过测试,
生成10000个随机不重复的数字耗时1秒钟左右,效率提升很多。

第三种方法,这个也是某天突然想到的,学习就是一个循序渐进的过程。猛地想很久都想不出来,但是说不定休息一下就突然想通了。第三种方法判断最少,所以最快,生成10000个随机不重复的数字耗时200毫秒左右,效率又提升了一截。

三种方法都是我自己想到的方法绝对原创,也是我的一个学习过程,现在把帖子重新编辑整理后三种方法一并贴出以供有需要的键友参考,希望可以帮助到你或者能够给你一些启发。
如果只是生成几十个随机不重复的数字三个方法没有多大区别效率差不多,随便挑一个就行。如果要生成的随机数较大,可以参考第三种方法。



【方法一】
  1. //测试效果:
  2. //生成随机且不重复的数组【范围在 1~20】
  3. dim res = _rndArr_1(1,20)
  4. TracePrint Join( res,",")
复制代码
  1. //直接复制下面的内容就可以查看效果
  2. Function _rndArr_1(min,max)

  3. //max为要生成的最大值 ,min为要生成的最小值
  4. //生成不重复随机数组
  5. Randomize
  6. Dim newArr = Array(), rndNumber, j = 0, boolean = false,local_max = max
  7. While (local_max >= min)

  8. //获得一个随机数
  9. rndNumber = Int((max - min + 1) * Rnd() + min)
  10. boolean = false

  11. //判断新数组是否存在此值
  12. For i = 0 to UBound(newArr) : If newArr(i) = rndNumber Then : boolean = true : Exit For : End If : Next
  13. If boolean = false Then : newArr(j) = rndNumber : j = j + 1 : local_max = local_max -1 : End If
  14. Wend

  15. //返回一个数组
  16. _rndArr_1 = newArr
  17. End Function
复制代码
--------------------------------------------------------------------------------------------------------------
---------------------------华丽的分割线------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
【方法二 --- 改良版】
  1. //方法二测试效果:
  2. Dim t = TickCount()

  3. //生成10000个随机不重复的数字的一个数组
  4. dim res = _rndArr_2(0,9999)
  5. TracePrint("生成随机不重复耗时:"& TickCount() - t & "毫秒")
  6. TracePrint "数组的最大下标"&UBound(res)
  7. TracePrint("--------------------------------------------------")
复制代码


【方法三 --- 最终版/ 速度最快】
  1. Dim t = TickCount()
  2. dim res = _rndArr_3(0,9999)
  3. TracePrint("生成随机不重复耗时:"& TickCount() - t & "毫秒")
  4. TracePrint "数组的最大下标"&UBound(res)
  5. TracePrint("--------------------------------------------------")
复制代码

下面隐藏的是方法二和方法三回复可见
  1. //【方法二 --- 改良版】
  2. Function _rndArr_2(min,max)

  3. //max为要生成的最大值 ,min为要生成的最小值
  4. Randomize
  5. Dim rndNumber = 0, count = 0, maxCount = max-min+1
  6. Dim newArr = Array(), compare = Array()
  7. While count < maxCount
  8.     
  9. //获得一个随机数
  10. rndNumber = Int((max - min + 1) * Rnd() + min)
  11.     
  12. //判断新数组是否存在此值,没有则放入
  13. If IsNull(compare( rndNumber)) Then
  14. compare( rndNumber) = 1 : newArr(count) = rndNumber : count = count +1
  15. End If
  16. Wend

  17. //返回一个数组
  18. _rndArr_2 = newArr
  19. End Function


  20. //【方法三 --- 最终版/ 速度最快】
  21. Function _rndArr_3(min,max)

  22. //max为要生成的最大值 ,min为要生成的最小值
  23. Randomize

  24. //得到一个有序的数组
  25. Dim n= 0,arr= Array()
  26. For num = min To max : arr(n) = num :n = n + 1 :next

  27. //while循环得到随机不重复数字
  28. Dim UB = UBound(arr), temp, i, j,count = 0
  29. While count < UB
  30.     
  31. //在数组arr内获得两个个随机数
  32. i = Int((UB + 1) * Rnd()) : j = Int((UB + 1) * Rnd())

  33. //打乱数组arr
  34. // 提高速度的关键是不需要判断,这里直接随机交换所以速度比上面的两种方法都要快
  35. temp = arr(i) : arr(i) = arr(j) : arr(j) = temp

  36. //计数器+1
  37. count = count +1
  38. Wend

  39. //返回一个数组
  40. _rndArr_3 = arr
  41. End Function
复制代码

最后编辑aboutbook 最后编辑于 2018-02-22 00:16:59

以建会友,共同学习,共同进步。无偿帮助解答各种简单小问题。

2#

前排占位

按键精灵安卓版编写脚本零基础课程【视频教程】

公众号:3分钟学堂
3#

生成一万个不重复随机数要多长时间

4#

回复 3楼NgZM的帖子

你生成一个试试呗

按键精灵安卓版编写脚本零基础课程【视频教程】

公众号:3分钟学堂
5#

顶一下

6#

谢谢分享

承接各类脚本 联系QQ: 9940 0460


PC,安卓,模拟器,脚本定制!
7#

生成一万个不重复随机数要多长时间

8#

dfgh

9#

看看是什么,学习一下

10#

asdasdsa

11#

谢谢楼主喽

12#


13#

去玩

14#

嘻嘻嘻爱上

15#

千金顶. . .


以建会友,共同学习,共同进步。无偿帮助解答各种简单小问题。

16#

机且不重复的数字数

17#

学习 ~~~~~~~~~~~

18#

学习学习

19#

谢谢分享经验

20#

学习

发新话题 回复该主题