加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > C语言 > 正文

Lua 实现简单的随机排序

发布时间:2020-12-15 00:04:19 所属栏目:C语言 来源:网络整理
导读:本文介绍了两种便捷好用的获取随机排序表的生成方式。这里所谓的随机排序是指从一个集合里面获取一个序列,这个序列的顺序是随机的。 排序法 function RandSort(t) math.randomseed( tonumber(tostring(os.time()):reverse():sub(1,6))) table.sort(t,functi

本文介绍了两种便捷好用的获取随机排序表的生成方式。这里所谓的随机排序是指从一个集合里面获取一个序列,这个序列的顺序是随机的。

排序法

function RandSort(t)
    math.randomseed( tonumber(tostring(os.time()):reverse():sub(1,6)))
    table.sort(t,function (a,b)
      return math.random(1,10) < 5
    end)
end

浅显直白的随机排序方法。
函数第一句的随机数种子是官方推荐的版本,提高随机性。需要注意的是,如果要在短时间内多次调用 RandFetch ,那么应当把设种子的句子拿到函数外面,否则得到的序列是一样的。

示例

local t = {1,2,3,4,5,6,7,8,9}
RandSort(t)

逐步缩减法

代码:

function RandFetch(list,num,poolSize,pool) -- list 存放筛选结果,num 筛取个数,poolSize 筛取源大小,pool 筛取源
    pool = pool or {}
    math.randomseed( tonumber(tostring(os.time()):reverse():sub(1,6)))
    for i=1,num do
        local rand = math.random(i,poolSize)
        local tmp = pool[rand] or rand -- 对于第二个池子,序号跟id号是一致的
        pool[rand] = pool[i] or i
        pool[i] = tmp
    table.insert(list,tmp)
end

end

函数内部主要是一个循环,每次取出一个值,直到取出 num 个值为止。对于每次循环,都会在 i 到 poolSize 范围内找出一个随机数,然后把这个值对应位置的元素放到 pool 的前方,保证下次取值是在pool 集合剩下的元素里面选取。
注意:

  1. pool 必须是个数组

  2. 筛选过程会破坏 pool 的顺序,所以这个 pool 应当视作一个与顺序无关的集合

用法

下面介绍一下这个函数的几种用法

  1. 生成一个从 1 - N 的随机排序序列

local N = 10
local t = {}
RandFetch(t,N,N)

--可能得到的 t > t = {4,1,10,9}

  1. 在一个 1 - N 的集合中随机取出 M 个元素

local N = 10
local M = 5
local t = {}
RandFetch(t,M,N)

--可能得到的 t > t = {3,9}

  1. 从题库挑选一些题目出来

local QstPool = {
{"选择题","世界上最聪明的人是谁?","达尔文","唐衣可俊","齐天大圣","爱因斯坦"},{"填空题","最小的质数是?"}
-- 省略若干题,"黄色和蓝色混合之后的颜色是和?"}}

local FillBlankPool = Filter(QstPool,"填空题") -- 从题库筛选所有填空题

local t = {}
RandFetch(t,#FillBlankPool,FillBlankPool)

注:以上代码未经过实测,若有语法错误等问题请指正,谢谢


同时发布于博客园:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读