Lua 隨機排序


本文介紹了兩種便捷好用的獲取隨機排序表的生成方式。這里所謂的隨機排序是指從一個集合里面獲取一個序列,這個序列的順序是隨機的。

排序法

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,3,2,5,6,7,8,1,10,9}
  1. 在一個 1 - N 的集合中隨機取出 M 個元素
local N = 10
local M = 5
local t = {}
RandFetch(t,M,N)

--可能得到的 t > t = {3,2,6,1,9}
  1. 從題庫挑選一些題目出來
local QstPool = {
{"選擇題","世界上最聰明的人是誰?"
,"達爾文","唐衣可俊","齊天大聖","愛因斯坦"}
,{"填空題","最小的質數是?"}
-- 省略若干題
,{"填空題","黃色和藍色混合之后的顏色是和?"}}


local FillBlankPool = Filter(QstPool,"填空題") -- 從題庫篩選所有填空題

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

注:以上代碼未經過實測,若有語法錯誤等問題請指正,謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM