AIDE手机编程初级教程(零基础向) 3.1 获取随机数函数的优化

第三章 优化小游戏

系列教程导航


3.1 获取随机数函数的优化


文章目录




前言

    在第三章序言这篇文章的后记,我布置了一个小作业:

给定三个int类型的数,a,b,c,请将它们的值按从小到大的顺序打印出来

    下面是我的答案:

class Sort{
	public static void main(String[] args){
		//给定的三个整数
		int a = 1;
		int b = 8;
		int c = 5;
		//我的思路如下:为了进行排序,就需要进行两两比较。于是,我们不妨定义三个变量来按顺序存储这三个数
		int min, mid, max;
		//分别算出各个值
		//算出min
		if(a < b){
			if(a < c) min = a;
			else min = c;
		}else{
			if(b < c) min = b;
			else min = c;
		}
		//算出max
		if(a > b){
			if(a > c) max = a;
			else max = c;
		}else{
			if(b > c) max = b;
			else max = c;
		}
		//剩下的就是mid了
		if(a == min | a == max){
			if(b == min | b == max) mid = c;
			else mid = b;
		}else{
			mid = a;
		}
		//最后依次打印min,mid和max
		System.out.println(min +","+ mid +","+ max);
	}

    相信你一定会觉得这个答案实在太长了。的确,以我们现在的知识来看的话,这个对于小孩子都是简单问题的题目,却变得麻烦起来。想想看,这还只是3个数,要是有100个数等着排序,那写起来将会多么复杂!

    事实上,我们在写猜数字小游戏的时候也曾经遇到过这样的问题,比如那个获取随机数的函数:

在这里插入图片描述

    这里大家也许还看不出有什么不方便的地方,我做一个假设:如果我们要判断一个100位数有没有重复的数字,使用上面的方法来写,会怎么样呢?

    答案是,我们会用上整整100个变量来存储这个100位数的各个数位,整个程序也许会达到两百多,甚至更多行。这显然是不合理的。所以,我们需要对判断一个数是不是有重复数位的方法进行优化。

    仔细想想,问题变得复杂的原因之一就是,变量的个数实在太多了。设想一下,假设某某班级有50名学生,但是他们没有座位,也没有学号,在教室里面可以随意走动。班主任想要统计同学们的身高情况,需要一个名字一个名字的叫,相信我,这一定是任何人都不想经历的事情。如果这些学生有自己的座位,我们就可以让他们按照座位顺序,依次上讲台报告身高情况;如果这些学生有自己的学号,我们也可以让他们按照学号顺序依次上讲台报告。这里我们就可以看出给学生排序的重要性。

    我们这里也一样。如果我们可以给一些具有类似功能的变量编上序号,那么操作它们就会变得非常方便,因为只需要操作它们的序号就行了。这样的话,我们甚至可以使用循环结构,只用几行代码,就可以操作几百个变量。




数组

    这个能给一大堆变量排序的工具就是数组。顾名思义,也就是把一堆数据分为一个组。事实上,数组就是存储同一类型数据的集合,我们可以把它理解为一个容器

    数组会把里面的元素自动编上序号,于是我们操作这些元素的时候,只需要操作这些序号就行了,非常方便。

    虽然名字叫做数组,但是数组里面不止可以存数字,还可以存字符串等等对象。只不过,同一个数组里面存储的元素必须是同一类型,并且数组的长度是不能改变的

    由此,我们可以猜想,创建一个数组,需要指定它的长度(因为数组一经创建,其长度就是固定的)。接下来,我们就来具体了解数组的用法:

    创建数组的格式如下:

//根据数组长度来创建数组。
格式1 元素类型[] 数组名 = new 元素类型[数组长度];
//根据数组里面所含的元素创建数组。
格式2 元素类型[] 数组名 = new 元素类型[]{元素1, 元素2, …};
格式3 元素类型[] 数组名 = {元素1, 元素2, …};

    比如,我们创建一个数组来存储数字1-10:

//创建一个长度为10的数组,元素类型是int
int[] arr = new int[10];//arr是array的缩写,array也就是数组的英文

    又比如,我们创建一个数组来存储表示性别的词:

//创建一个数组并指定里面的元素为"男","女"
String[] arr = new String[]{"男","女"};

    这个数组还可以这么创建:

String[] arr = {"男","女"};

    相信大家对数组的创建过程已经有了初步认识了。接下来,我继续讲解如何操作数组元素:

    假设我们创建了一个长度为3的整型数组

int[] arr = new int[3];

    注意数组元素的编号是从0开始的。数组第i位上的元素可以这么得到:

arr[i]

    于是,如果我们想要把这个数组的编号为0的元素的值修改为5,需要这样写:

arr[0] = 5;

    这里的=是赋值号。同样的,把编号为1的元素修改为9:

arr[1] = 9;

    最后说一说获取数组的长度的方法:

arr.length

    由于数组也是对象,而length是它的一个成员变量,类型是int,记录了它的长度,所以我们可以这样获取到数组的长度。

    是不是非常简单!(*^ω^*)接下来,我们就来使用数组来优化小游戏中生成随机数的函数




优化

    生成随机数的函数如下:

在这里插入图片描述

    很自然地,我们可以把这个四位随机数的各个数位都存到一个数组里面去,然后再判断这个数组中有没有重复的元素。

    首先,我们想一想怎么把这个数变成一个数组。这个过程也许会很复杂,根据面向对象的思想,我们可以考虑数字对象自身有没有这种函数。事实上,并没有。不过,字符串对象有一个函数toCharArray(),它可以返回对应字符串的各个字符组成的字符数组。所以,我们首先把这个数字转为字符串(简单起见,我们直接把这个数字和空字符串连起来):

7

    然后调用这个字符串自身的函数,得到一个字符数组:

在这里插入图片描述

    假设产生的随机数只有三位,那么我们需要将str前面加上一个"0"。

在这里插入图片描述

    假设num的值为1435,那么digits数组里面的元素将会依次为:'1','4','3','5'。至此,我们成功地把一个整数转换为了一个数组,里面存放着它的各个数位。接下来,我们来设法判断这个数组中是否有重复的元素。我的思路如下:

假设一个数组有n个元素。对于数组的第i个元素,我们只需要分别判断它和第i+1,i+2,…,n个元素相等,即可保证数组中任意两个数都会互相比较一次。
我们把i从0开始,取到n-2(第n-1个元素就是最后一个),即可完成重复元素的判断
所以我们可以使用一个双循环(也就是一个循环里面再写一个循环),外面的循环控制i的值,里面的循环控制第i个元素需要和哪一个元素比较。

    所以,我写出来是这样:

在这里插入图片描述

    到这里,我们就对产生随机数的函数进行了简单的优化。大家可以对比一下优化前后的区别。




后记

    本节,我们通过优化产生随机数的函数,学习了数组的知识。数组是我们经常使用到的一种“容器”,而且操作起来很简单,所以大家一定要熟练掌握。

感谢你的阅读!本教程会长期不定时更新。本人不是大神,也会犯错,如果有建议或者提问的话,欢迎评论留言!

作者头像

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值