本篇主要是參考 lua連續隨機數 這篇文章完成。大家可以去原貼查看學習。
生成隨機數組,暫時發現兩種方法
1、把生成的數放到一個表里面,每次隨機時判斷這個表里是否有,若有再隨機一次(問了朋友,很多人都想到這個方法)
2、先生成一個連續的數字表t,每次隨機一個數n,把t[n]保存,並移除t[n]
首先,說一下我的真實需求是給定一定范圍,然后生成指定個數的不重復隨機數組。這個給定范圍,可能很大,可能很小,指定個數可能比數組個數大,也可能只比數組個數小一點,也可能比數組個數小很多。
例如,1、從1~100,這100個數內,隨機生成10個不重復數字數組。
2、從1~1000,這1000個數內,隨機生成10個不重復數字數組。
3、從1~15,這15個數內,隨機生成10個不重復數字數組。
當需求是例2時,生成方法一沒有任何問題。
需求是例1時,生成方法一也湊合沒問題。
但是,當需求是例3時,生成方法三的重復概率過高,使得隨機次數無限增大(我的機器就直接卡死不動來進行反抗)。
根據需求,於是用生成方法二生成隨機數。
下文附上原貼中的代碼(我要去吃飯了,自己的代碼就先不貼了):
--產生1~~m,若有n的則m~~n的數字表 function table.fillNum(m,n) local j,k if n then j=m k=n else j=1 k=m end local t={} for i=j,k do table.insert(t,i) end return t end --產生不相同的從m到n,一共cnt個隨機數表 function math.randomx( m,n,cnt ) --方法1 if cnt>n-m+1 then return {} end local t = {} local tmp = {} math.randomseed(os.time()) while cnt>0 do local x =math.random(m,n) if not tmp[x] then t[#t+1]=x tmp[x]=1 cnt=cnt-1 end end return t end --同上 (我對方法2做了修改,以符合自己的需求) function math.randomEx(m,n,cnt) --方法2
local tmp=table.fillNum(m,n)
if cnt>n-m+1 then return tmp end local x=0 local t={}math.randomseed(os.time()) while cnt>0 do x=math.random(1,n-m+1) table.insert(t,tmp[x]) table.remove(tmp,x) cnt=cnt-1 m=m+1 end return t end t=math.randomx(11, 25, 6) for i=1,6 do print(t[i]) end print("...........") t=math.randomEx(11, 25, 6) for i=1,6 do print(t[i]) end