本文介紹了兩種便捷好用的獲取隨機排序表的生成方式。這里所謂的隨機排序是指從一個集合里面獲取一個序列,這個序列的順序是隨機的。
排序法
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 集合剩下的元素里面選取。
 注意:
- pool 必須是個數組
 - 篩選過程會破壞 pool 的順序,所以這個 pool 應當視作一個與順序無關的集合
 
用法
下面介紹一下這個函數的幾種用法
- 生成一個從 1 - N 的隨機排序序列
 
local N = 10
local t = {}
RandFetch(t,N,N)
--可能得到的 t > t = {4,3,2,5,6,7,8,1,10,9}
 
        - 在一個 1 - N 的集合中隨機取出 M 個元素
 
local N = 10
local M = 5
local t = {}
RandFetch(t,M,N)
--可能得到的 t > t = {3,2,6,1,9}
 
        - 從題庫挑選一些題目出來
 
local QstPool = {
{"選擇題","世界上最聰明的人是誰?"
,"達爾文","唐衣可俊","齊天大聖","愛因斯坦"}
,{"填空題","最小的質數是?"}
-- 省略若干題
,{"填空題","黃色和藍色混合之后的顏色是和?"}}
local FillBlankPool = Filter(QstPool,"填空題") -- 從題庫篩選所有填空題
local t = {}
RandFetch(t,5,#FillBlankPool,FillBlankPool)
 
        注:以上代碼未經過實測,若有語法錯誤等問題請指正,謝謝
