在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
生成随机数组,暂时发现两种方法 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
|
请发表评论