使用键值对数组构造的无重复随机数算法

打印 上一主题 下一主题

主题 922|帖子 922|积分 2766

  1. -- @param list_length 生成的数组长度
  2. -- @param max_random_length 随机数的最大范围
  3. math.generate = function (list_length, max_random_length)
  4.         local random = {}
  5.         local random_list = {}
  6.         -- 输出随机数表, 通过判断是否存在随机数键避免重复随机数
  7.         for i = 1, list_length do
  8.                 local random_number = math.random(1, max_random_length)
  9.     -- 当存在该随机数时, 重复随机至不重复
  10.                 while random[random_number] do
  11.                         random_number = math.random(1, max_random_length)
  12.                 end
  13.                 random[random_number] = true
  14.         end
  15.         for key, value in pairs(random) do
  16.                 table.insert(random_list, key)
  17.         end
  18.         return random_list
  19. end
复制代码
在上面的函数math.generate中, 需要传入两个参数: 随机数表的长度list_length和最大随机数max_random_length. 返回1个没有重复值的随机数表.
由于lua的table本质上是键值对动态数组, 所以(line 14)可以直接将随机出来的数字random_number传入key中, 这样就表示这个随机数已经有了, 后续再随机出相同的随机数就会进入(line 11)的循环中去再次随机.
这样做的好处是, 不用和按顺序填充随机数表时, 每随机出一个值就需要和前面的所有值进行遍历查询, 这种随机数生成方式只需要比对一次就知道是否重复, 极大减少了时间复杂度.
最后, 通过pairs迭代器遍历出random所有的键(随机数)就构成了一个新的无重复随机数组random_list.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表