用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;

时间: 2024-10-27 08:16:38

用lua实现的不重复随机数的相关文章

相邻不重复随机数的生成及优化

生成相邻不重复随机数是之前抽奖插件的遗留问题,在之前的文章中已经简单说过,但没有更好的解决方案.经过一个多月的修改,抽奖插件已经趋于完善,在此分享一下这个问题的解决方法.以下是最初的方法,但是会出现一个单独的全局变量,整体而言稍显多余,不算完美. // 产生相邻不重复的随机数,n 为随机数个数 var b = 0; function random(n) { var a = Math.floor(Math.random() * n); if (a == b) { return random(n);

生成不重复随机数函数

// 生成随机数函数 function createRandom(num,from,to) { var arr=[]; // 随机数数组 var json={}; // 标记json对象 while(arr.length<num) { // 产生单个随机数 var ranNum=Math.round(Math.random()*(to-from))+from; // 通过判断json对象的索引值是否存在 来标记 是否重复 if(!json[ranNum]) { json[ranNum]=1; a

Java编程:实现双色球彩票生成器,生成不重复随机数

public static void main(String[] args) {  System.out.print("红色的号码为:");  Set<Integer> set=new HashSet<Integer>();  while (true) {   int i=(int)(Math.random()*33+1);   set.add(i);   if (set.size()>=6) {    break;   }  }  for (Object

C#产生不重复随机数

static int GetRandomSeed( ) { byte[] bytes = new byte[4]; System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider( ); rng.GetBytes( bytes ); return BitConverter.ToInt32( bytes , 0 ); } Ran

算法:如何高效产生m个n范围内的不重复随机数(m&lt;=n)

最近网上看到一道题,如何取100以内不重复的100个随机数?代码如下: var nums = new int[100]; var list = new List<int>(); var random = new Random(); for (int i = 0; i < 100; i++) { int r; while (list.Contains(r = random.Next(0, 99))) { } list.Add(r); nums[i] = r; } 个人感觉题目很经典,因为实

PHP:产生不重复随机数的方法

来源:http://www.ido321.com/1217.html 无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下(ps:方法1.4.5是我常用的,其余来自网络整理) 方法一: <?php $numbers = range (1,50); //shuffle 将数组顺序随即打乱 shuffle ($numbers); //array_slice 取该数组

PHP产生不重复随机数的5个方法总结

无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下 无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下 方法一: $numbers = range (1,50); //shuffle 将数组顺序随即打乱 shuffle ($

mysql生成不重复随机数(unique number generation)

转自:http://blog.csdn.net/dreamer2020/article/details/52049629 问题来源 业务中有时会遇到要生成不重复随机数的情况,例如,新生成一个商品编号.房间编号.或者其他物品编号等.不愿意采用表的自增索引 id,同时又希望新生成的编号是不重复的. 这就需要考验mysql的随机数功能了. Solution mysql的rand函数可以生成一个0到1之间的随机数,进行一定的放大即可得到一个随机数.再通过条件查询来限制新随机数没有在表中出现过.如下所示:

【VBA研究】VBA产生不重复随机数

作者:iamlasong VBA编程实现不重复随机数输出.VBA里的随机函数是RND,在工作表中随机函数是RAND,一字之差,可要记好了.RND取值范围是[0,1),意思是0和1之间的一个随机数,包含0,但不包含1. 1.用法 语法:Rnd[(number)] 如果 number 的值是 Randomize 生成 小于 0 ,每次都使用 number 作为随机数种子得到的相同结果. 大于 0 ,以上一个随机数为种子产生下一个随机数. 等于 0 ,产生与最近生成的随机数相同的随机数. 省略, 以上