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