Lua 实现简单的随机排序

前端之家收集整理的这篇文章主要介绍了Lua 实现简单的随机排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

@H_301_2@排序法
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)
@H_301_2@逐步缩减法

代码

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)

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


同时发布于博客园:

猜你在找的程序笔记相关文章