Lua在給定范圍內,生成指定個數不重復隨機數組


本篇主要是參考 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

 


免責聲明!

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



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