空间复杂度为(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;