本发明涉及求取算法领域,尤其涉及一种基于空间搜索的唯一随机数序列的求取算法。
背景技术:
唯一随机数序列在计算机游戏、软件测试用例、计算机考试等场景中经常用到,一种最平常的算法是:将每次产生的随机数进行比较,以前如果出现过就再发生一次,这样如果序列很长的话,越到后面的运算,所花的时间越长,并且其时间复杂度是无法估计的(因为不知道什么时候才能产生与前面不一样的随机数)。通常情况下,由于所使用的随机序列不长或者对时间要求不高,并且出现极端情况的几率很小,所以遇上麻烦的情况很少,并且即使遇到问题也可以通过其他手段处理(比如:中止进程),因此,该问题通常情况被忽视。
基于空间搜索的唯一随机数序列的求取算法拟解决的问题是:在已知随机序列的数的上界和下界、随机序列的长度的情况下,能否找到一种算法,其空间复杂度为o(max-min),(max:随机序列的上界,min:随机序列的下界),时间复杂度尽可能小,并且不会出现理论上的无限循环。这样的算法应该尽可能简单(能为一般软件人员接受),但非常巧妙,因此可以为千千万万的软件所使用,因而变得十分有意义。
绝大多数的软件人员,或多或少都碰到过这个问题,但都忽视了该问题的极端情况。因此,大多数程序员容易忽略巧妙方法的存在;或者说难以提出问题,也就更不会深入思考了。
因此,有必要提供一种基于空间搜索的唯一随机数序列的求取算法解决以上技术问题。
技术实现要素:
本发明的目的为了减少获取唯一随机序列的计算量,本算法通过构造一个一维的连续整数数组,通过随机检索该数组的元素,获得一个随机数序列。由于检索是随机的,所以确定该序列是随机的;由于是随机检索,当两次检索到同一个数时,需要考虑一个轮转机制,或者使用其他方法处理。
本发明提供一种基于空间搜索的唯一随机数序列的求取算法,将直接求取随机序列的过程转变为求取一个已知序列的随机地址指针的过程,主要包括下面步骤:
步骤1,变量赋值,定义随机序列的最大值max,最小值min,一个长度为data[max-min]的数组和一个长度为length的空数组data1,其中length为待求随机序列的长度;
步骤2,如果max-min<length,转到步骤9;
步骤3,按照从小(min)到大(max),循环给data赋值;
步骤4,定义一个循环变量i=0,如果i>=length,转到步骤9;
步骤5,产生一个0<n<max-min的随机数,取data[n];
步骤6,如果data[n]=invalid,n=(n+1)mod(length),回到步骤6;
步骤7,data1[i]=data[n],data[n]=invalid,i=i+1转4;
步骤8,输出data1;
步骤9,结束。
与相关技术相比,本发明提供的基于空间搜索的唯一随机数序列的求取算法对于需要频繁使用随机数序列的场合,如:计算机游戏、在线考试系统等应用场景,可以大幅缩减计算时间,提高软件的运行效率,并排除极端情况下出现的死循环。
附图说明
图1为本发明提供的基于空间搜索的唯一随机数序列的求取算法的流程图。图2为求取一个[0,10)以内的5个唯一随机正整数序列情况下,采用该算法运算的部分空间变化图。该图表示通过两次运算之后的搜索空间的变化情况,第一行为原始空间状态,左边10个圆表示data数组,右边5个圆表示data1,第二行、第三行是经过一轮搜索之后,空间变化情况,第四、五行表示第二次随机搜索之后的空间变化。
具体实施方式
以下将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。为叙述方便,下文中如出现“上”、“下”、“左”、“右”字样,仅表示与附图本身的上、下、左、右方向一致,并不对结构起限定作用。
阅读本例请参阅图1和图2(本发明提供的基于空间搜索的唯一随机数序列的求取算法的流程图和空间变化示意图)。
假设需要求取一个[0,10)以内的5个唯一随机正整数序列(实际情况可能比这个序列大得多),按照本发明提供的算法,这里max=10,min=0,length=5,由于是正整数,取invalid=-1;采用最简单的循环赋值方式为长度为10的一维连续整数数组赋值;采用向后顺序流转作为冲突消解策略。
按照本发明提供的基于空间搜索的唯一随机数序列的求取算法,求取过程按照如下进行:
步骤1,变量赋值,定义随机序列的最大值max,最小值min,一个长度为data[max-min]的数组和一个长度为length的空数组data1,其中length为待求随机序列的长度;
步骤2,如果max-min<length,转到步骤9;
步骤3,按照从小(min)到大(max),循环给data数组赋值;
步骤4,定义一个循环变量i=0,如果i>=length,转到步骤9;
步骤5,产生一个[0,10)之间的随机数n,取data[n];
步骤6,如果data[n]=invalid,n=(n+1)mod(length),回到步骤6;
步骤7,data1[i]=data[n],data[n]=invalid,i=i+1转4;
步骤8,输出data1;
步骤9,结束。
由上述算法过程可以看出,该计算方法巧妙之处在于步骤3的顺序赋值,步骤5由直接产生随机数而变化为产生随机的下标指针,步骤6的冲突处理机制;该程序的空间复杂度与前面给定的条件一致,为o(max-min),时间复杂度为t(lenth^2/2),算法完全可控。
与相关技术相比,本发明提供的基于空间搜索的唯一随机数序列的求取算法对于求取给定取值范围的一个唯一随机数序列问题,通过建立一个已知的非随机的顺序数字空间,简单地在该顺序空间随机检索,在时间复杂度t(n)情况下(n为随机数的个数),取得一个唯一的随机数序列,避免了二次生成随机数和进行循环比较,从而大幅提高程序的运行效率。该算法在计算机游戏、随机测试题目的抽取等方面将获得广泛应用。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其它相关的技术领域,均同理包括在本发明的专利保护范围内。