求职不怕考
pcw-chendx@vip.sina.com
与编程相关的招聘,都会准备很多考题,一不小心考生就在考题上栽了跟头,特别是没有多少工作经验的应届毕业生,往往回答得过于理论化,很难令考官满意。为此,我们特意推出本系列,通过对真实考题的分析让大家在回答考题时有更多的实用性,让考官满意,顺利找到工作。
高效生成随机数组
爪哇米工作室陈跃峰
算法是程序的灵魂,所以在面试中基本都要考核应聘者的算法能力。算法的种类有很多,每种算法在实现时都有独立的方式,本文将介绍的生成随机数组的算法只是其中的一种。生成随机数组,即固定的一组数组但是数字位置随机的数组,是一种反映应聘者基础数字逻辑掌握程度的基础算法。下面以一个简单的例子来介绍高效生成随机数组的算法实现。
招聘题目:生成20个随机数字,该组数字中包含2组1-10之间的整数,即包含2个1、2个2,依次类推,但是每个数字的位置是随机的。
答案A:
intnum[]=newint[20];
intindex=0;//数组下标
intranNum;//随机数字
inttime=0;//数字已出现次数
Randomr=newRandom();
while(true){
ranNum=r.nextInt(9)+1;//随机1-10之间的数字
//统计数字ranNum已出现次数
time=0;
for(inti=0;i<index;i++){
if(num[i]==ranNum){
time++;
}
}
//如果未出现2次
if(time!=2){
num[index]=ranNum;
index++;//继续赋值下一个
}
if(index==num.length){//全部赋值
break;
}
}
答案B:
//生成2组1-10之间的规则数字
intnum[]=newint[20];
for(inti=0;i<num.length;i++){
num[i]=i/2+1;
}
//随机打乱数字顺序
Randomr=newRandom();
inttimes=30;//两两交换次数
intranIndex;//随机下标
inttemp;//交换变量
intcIndex;//当前下标
for(inti=0;i<times;i++){
ranIndex=r.nextInt(20);//[0-20]之间的随机数,作为下标
//和下标i%20交换
cIndex=i%20;
if(cIndex!=ranIndex){
temp=num[cIndex];
num[cIndex]=num[ranIndex];
num[ranIndex]=temp;
}
}
正确答案:B
答案分析
在答案A中,使用的是自然思维,既按照随机生成一个1-10之间的数字,然后判断该数字是否已在数组中出现2次,如果未出现2次,则将该数字赋值到数组中,接着随机下一个数字。使用这种方式实现的代码,虽然理论上可以完成要求的功能,但是在程序的执行效率上很不稳定,每次随机的过程需要的时间的耗时差异很大,甚至有可能卡住程序的执行,所以在程序中生成比较多的随机数字组合时,不推荐这样进行实现。
在答案B中,采用的思路是一种变通的思路,即首先生成一组规则的数字,然后随机打乱改组数字的顺序。使用这种思路,程序的执行效率很稳定,而且实现起来比较简单。
实现的具体步骤是,首先生成两组1-10之间的整数,按照1,1,2,2,……这样的顺序依次赋值到数组中,这样得到的是一个规则的数组num,这个数组中包含所有需要的数字,即2组1-10之间的数字,但是数字的顺序是规则的。接着使用两两交换的方式随机交换数组中数字的位置,交换的方法是生成一个0到数组长度(不包含)的随机数字,作为一个数组交换时的下标,然后和数组当前的下标,即第一次下标为0,第二次下标为1,的元素进行交换,这样经过一定次数的交换以后,数组中的数字位置就变得随机了。而每次的交换消耗的时间是基本固定的,所以实现起来整个算法的执行效率很稳定,生成的速度也很高效。
实际应用
高效生成随机数组这种算法在实际的程序开发中也大量的进行使用。例如在棋牌类的游戏开发中,例如斗地主、双扣等,在每次游戏开始时,都需要打乱扑克牌的顺序,然后再将打乱以后的扑克牌依次发放给每个游戏玩家。而这种打乱扑克牌顺序的算法通常就被称作洗牌算法。
从程序开发的角度看洗牌算法,实际上生成的就是一组规则的随机数字,例如对于一副扑克牌来说,在程序中如果需要代表一副扑克牌,根据扑克牌的特点(每幅牌包含54张不同的牌)则只需要为每张牌进行编号即可,例如将扑克牌中的每张牌依次对应编号成0-53之间的整数,那么一副牌就是一个包含0-53之间所有整数的数组。而洗牌就是将这样一个规则的数组变成一个随机数组,但是必须包含所有0-53之间的所有整数,这个要求和前面介绍中的算法实现的功能是一致的。
则根据前面介绍的算法,在一副扑克牌的斗地主游戏中实现洗牌的代码如下:
//生成一幅牌,编号为0-53
intpoker[]=newint[54];
for(inti=0;i<poker.length;i++){
poker[i]=i;
}
//洗牌
Randomr=newRandom();
inttimes=54;//两两交换次数
intranIndex;//随机下标
inttemp;//交换数字
intcIndex;//当前下标
for(inti=0;i<times;i++){
ranIndex=r.nextInt(54);//[0-53]之间的随机数
//和下标i%54交换
cIndex=i%54;
if(cIndex!=ranIndex){
temp=poker[cIndex];
poker[cIndex]=poker[ranIndex];
poker[ranIndex]=temp;
}
}
点评:在该代码中,利用前面介绍的算法首先生成一个包含[0,53]之间所有整数的规则数组poker,然后再使用两两交换的方式对于该数组中的元素交换54次,这个次数可以根据需要进行调整,从而得到了一个符合逻辑要求的数组poker。而对于玩家来说,poker这个数组就是一副被洗过的扑克牌,可以以此为基础进行游戏后续的逻辑的开发了。
分享到:
相关推荐
《企业会计准则第30号——财务报表列报》应用指南汇编.pdf
发现网上的很多制作汉字点阵的工具经常会被某些杀毒软件报木马病毒,挺吓人的,于是使用自己熟悉的windows编程工具,利用字摸提取原理做了一个点阵数组生成的小工具,可以将windows系统的各种字体转化为常用的24*24...
《企业会计准则第30号——财务报表列报》应用指南(2022年度新修订)汇编.pdf 《企业会计准则第30号——财务报表列报》应用指南(2022年度新修订)汇编.pdf是中国大陆地区财务报表编制的重要依据,本指南对财务报表...
植物大战僵尸————报纸僵尸(报纸掉落时)
### 企业会计准则第 30 号——财务报表列报应用指南解析 #### 一、总体要求 《企业会计准则第 30 号——财务报表列报》旨在规范企业在编制财务报表时的各项标准与流程,确保财务信息的准确性、一致性和可比性。该...
根据提供的文件信息,虽然没有给出具体的内容段落,但我们可以从标题和描述中提取出与“企业会计准则第37号——金融工具列报”相关的关键知识点。以下是关于该主题的知识点总结: 1. 企业会计准则第37号概述 企业...
电脑报官方网站是中国发行量最大的计算机报——《电脑报》的官方网站,也是一个专业、全面、及时的数码产品信息聚合站。为用户及时提供每期电脑报上的精彩文章以及丰富的数码产品资讯,包括产品新闻、评测、导购、...
植物大战僵尸————报纸僵尸
财政部会计司新企业会计准则讲座——金融工具列报.pdf
毕业设计:本科毕业设计:蓝牙防丢器Bluetooth anti-lost App ——可自行设定报警dBm&报警距离
电脑报 电脑报阅读系统 电脑报合订本 电脑报电子版 电脑报阅读系统2008
电脑报在线是中国发行量最大的计算机报——《电脑报》的官方网站,也是一个专业、全面、及时的数码产品信息聚合站。
《企业会计准则第30号——财务报表列报》应用指南是指导企业如何按照会计准则编制和呈现财务报表的重要文件。这份指南详细规定了企业在编制财务报表时应遵循的基础、重要性判断、正常营业周期的定义、终止经营的处理...
【ASP.NET源码——HSORT电子报纸管理系统】是一款基于ASP.NET技术开发的高效、实用的电子报纸管理平台。此系统提供了全面的新闻编辑、发布、管理和检索功能,旨在帮助新闻机构或个人用户更加便捷地创建、维护和分享...
《企业会计准则第30号——财务报表列报》是规范中国企业编制和列示财务报表的重要准则,旨在确保财务信息的准确性和完整性,便于投资者和其他利益相关者理解企业的财务状况和经营成果。准则中涉及的主要内容包括: ...
———————— 团购 相较于直接购买,以一个更优惠的价格吸引用户带动用户,完成商品的团购。 ———————— 砍价 用户熟悉的裂变玩法,引爆社群、朋友圈、迅速裂变,低成本获客利器。 ———————— 发券...
"生成随机数据_2"这个主题可能涉及的是如何在Excel中更高效、更灵活地创建一系列随机数值。以下是一些关键知识点: 1. **RAND函数**:这是Excel中最基本的随机数生成函数。RAND()返回一个介于0(包括)和1(不包括...
《企业会计准则第30号——财务报表列报》是中国会计准则体系中关于财务报表编制和列报的重要规范,旨在确保财务报表的可比性和透明度。这份准则的修订版于2014年7月1日起在执行企业会计准则的企业中实施,旨在提升...
首先,我们从标题"**C#自动弹出窗口、播放音乐——报警插件**"出发,理解其核心功能。这个插件的主要任务是监控数据库,当检测到特定条件满足时,执行两个关键操作:一是弹出警告窗口通知用户,二是播放预设的音乐...