本文介绍了两种便捷好用的获取随机排序表的生成方式。这里所谓的随机排序是指从一个集合里面获取一个序列,这个序列的顺序是随机的。
@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 集合剩下的元素里面选取。
注意:
pool 必须是个数组
筛选过程会破坏 pool 的顺序,所以这个 pool 应当视作一个与顺序无关的集合
用法
local N = 10
local t = {}
RandFetch(t,N,N)
--可能得到的 t > t = {4,1,10,9}
在一个 1 - N 的集合中随机取出 M 个元素
local N = 10
local M = 5
local t = {}
RandFetch(t,M,N)
--可能得到的 t > t = {3,9}
从题库挑选一些题目出来
local QstPool = {
{"选择题","世界上最聪明的人是谁?","达尔文","唐衣可俊","齐天大圣","爱因斯坦"},{"填空题","最小的质数是?"}
-- 省略若干题,"黄色和蓝色混合之后的颜色是和?"}}
local FillBlankPool = Filter(QstPool,"填空题") -- 从题库筛选所有填空题
local t = {}
RandFetch(t,#FillBlankPool,FillBlankPool)
同时发布于博客园: