《高校生成随机数组》由会员分享,可在线阅读,更多相关《高校生成随机数组(5页珍藏版)》请在金锄头文库上搜索。
1、高校生成随机数组高校生成随机数组与编程相关的招聘,都会准备很多考题,一不小心考生就在考题上栽了跟头,特别是没有多少工作经验的应届毕业生,往往回答得过于理论化,很难令考官满意。为此,我们特意推出本系列,通过对真实考题的分析让大家在回答考题时有更多的实用性,让考官满意,顺利找到工作。高效生成随机数组爪哇米工作室 陈跃峰算法是程序的灵魂,所以在面试中基本都要考核应聘者的算法能力。算法的种类有很多,每种算法在实现时都有独立的方式,本文将介绍的生成随机数组的算法只是其中的一种。生成随机数组,即固定的一组数组但是数字位置随机的数组,是一种反映应聘者基础数字逻辑掌握程度的基础算法。下面以一个简单的例子来介绍
2、高效生成随机数组的算法实现。招聘题目:生成 20 个随机数字,该组数字中包含 2 组 1-10 之间的整数,即包含 2 个 1、2 个 2,依次类推,但是每个数字的位置是随机的。答案 A:int num = new int20;int index = 0; /数组下标int ranNum; /随机数字int time = 0; /数字已出现次数Random r = new Random();while(true)ranNum = r.nextInt(9) + 1; /随机 1-10 之间的数字/统计数字 ranNum 已出现次数time = 0;for(int i = 0;i index;i+
3、)if(numi = ranNum)time+;/如果未出现 2 次if(time != 2)numindex = ranNum;index+; /继续赋值下一个if(index = num.length) /全部赋值break;答案 B:/生成 2 组 1-10 之间的规则数字int num = new int20;for(int i = 0;i num.length;i+)numi = i / 2 + 1;/随机打乱数字顺序Random r = new Random();int times = 30; /两两交换次数int ranIndex; /随机下标int temp; /交换变量int
4、 cIndex; /当前下标for(int i = 0;i times;i+)ranIndex = r.nextInt(20); /0-20之间的随机数,作为下标/和下标 i % 20 交换cIndex = i % 20;if(cIndex != ranIndex)temp = numcIndex;numcIndex = numranIndex;numranIndex = temp;正确答案:B答案分析在答案 A 中,使用的是自然思维,既按照随机生成一个 1-10 之间的数字,然后判断该数字是否已在数组中出现 2 次,如果未出现 2 次,则将该数字赋值到数组中,接着随机下一个数字。使用这种方式
5、实现的代码,虽然理论上可以完成要求的功能,但是在程序的执行效率上很不稳定,每次随机的过程需要的时间的耗时差异很大,甚至有可能卡住程序的执行,所以在程序中生成比较多的随机数字组合时,不推荐这样进行实现。在答案 B 中,采用的思路是一种变通的思路,即首先生成一组规则的数字,然后随机打乱改组数字的顺序。使用这种思路,程序的执行效率很稳定,而且实现起来比较简单。实现的具体步骤是,首先生成两组 1-10 之间的整数,按照1,1,2,2,这样的顺序依次赋值到数组中,这样得到的是一个规则的数组 num,这个数组中包含所有需要的数字,即 2 组 1-10之间的数字,但是数字的顺序是规则的。接着使用两两交换的方
6、式随机交换数组中数字的位置,交换的方法是生成一个 0 到数组长度(不包含)的随机数字,作为一个数组交换时的下标,然后和数组当前的下标,即第一次下标为 0,第二次下标为 1,的元素进行交换,这样经过一定次数的交换以后,数组中的数字位置就变得随机了。而每次的交换消耗的时间是基本固定的,所以实现起来整个算法的执行效率很稳定,生成的速度也很高效。实际应用高效生成随机数组这种算法在实际的程序开发中也大量的进行使用。例如在棋牌类的游戏开发中,例如斗地主、双扣等,在每次游戏开始时,都需要打乱扑克牌的顺序,然后再将打乱以后的扑克牌依次发放给每个游戏玩家。而这种打乱扑克牌顺序的算法通常就被称作洗牌算法。从程序开
7、发的角度看洗牌算法,实际上生成的就是一组规则的随机数字,例如对于一副扑克牌来说,在程序中如果需要代表一副扑克牌,根据扑克牌的特点(每幅牌包含 54 张不同的牌)则只需要为每张牌进行编号即可,例如将扑克牌中的每张牌依次对应编号成 0-53 之间的整数,那么一副牌就是一个包含 0-53 之间所有整数的数组。而洗牌就是将这样一个规则的数组变成一个随机数组,但是必须包含所有 0-53 之间的所有整数,这个要求和前面介绍中的算法实现的功能是一致的。则根据前面介绍的算法,在一副扑克牌的斗地主游戏中实现洗牌的代码如下:/生成一幅牌,编号为 0-53int poker = new int54;for(int
8、i = 0;i poker.length;i+)pokeri = i;/洗牌Random r = new Random();int times = 54; /两两交换次数int ranIndex; /随机下标int temp; /交换数字int cIndex; /当前下标for(int i = 0;i times;i+)ranIndex = r.nextInt(54); /0-53之间的随机数/和下标 i % 54 交换cIndex = i % 54;if(cIndex != ranIndex)temp = pokercIndex;pokercIndex = pokerranIndex;pokerranIndex = temp;点评:在该代码中,利用前面介绍的算法首先生成一个包含0,53之间所有整数的规则数组 poker,然后再使用两两交换的方式对于该数组中的元素交换 54 次,这个次数可以根据需要进行调整,从而得到了一个符合逻辑要求的数组 poker。而对于玩家来说,poker 这个数组就是一副被洗过的扑克牌,可以以此为基础进行游戏后续的逻辑的开发了。