用lua实现的不重复随机数

空间复杂度为(1-n),时间复杂度为应该也是最低的,lua方便之处还是很值得利用的

local Random = {};

function Random:Awake()

self.m_min = 1;

self.m_max = 1;

self.m_end = 1;

self.m_rangeMap = {};

end

function Random:setRange( min,max )

if min > max then

min,max = max ,min;

end

self.m_min = min;

self.m_max = max;

self.m_end = max;

self.m_rangeMap[self.m_max] = self.m_max;

end

-------------------不重复------------------------------

function Random:getRandom( ... )

math.randomseed(tostring(os.time()):reverse():sub(1,6));--避免时差太小

math.random(self.m_min,self.m_max);--过滤掉前几个劣质随机数;

math.random(self.m_min,self.m_max);

math.random(self.m_min,self.m_max);

local tmp = math.random(self.m_min,self.m_max);

local ret = self.m_rangeMap[tmp];

if ret == nil then

ret = tmp;

end

self.m_rangeMap[tmp] = self.m_max;

self.m_max = self.m_max - 1;

return ret;

end

function Random:getRandomNormal( ... )

math.randomseed(tostring(os.time()):reverse():sub(1,6));--避免时差太小

math.random(self.m_min,self.m_end);--过滤掉前几个劣质随机数;

math.random(self.m_min,self.m_end);

math.random(self.m_min,self.m_end);

local ret = math.random(self.m_min,self.m_end);

local tmp = self.m_rangeMap[ret];

if tmp == nil then

self.m_rangeMap[ret] = self.m_max;

self.m_max = self.m_max - 1;

end

return ret;

end

return Random;