Java教程专栏:https://blog.csdn.net/qq_41806966/category_9929686.html
这节讲解 Java 中随机数的使用.
目录
随机数
什么是随机数? 简单理解就是一个数字,它第一次运行可能为1,第二次可能为2,3,4,5....等,这个数是随机的(通过一系列算法).
在Java中,提供了以下几种方法来生成随机数.
Math.random()
Math 是 JDK 中的一个类,包含一些数学计算等.
在 Math 类中,有一个方法为 random(),可以获取 0-1之间的随机数(小数)
使用 Math.random()
测试多次结果
通过结果可以看出,运行的同一个程序,但是生成的数是不一样的.
取指定随机数
通过上面的 Math.random() 我们可以获取一个从 0-1 的随机数.
生成的随机数是小数,并且是从0-1(数量很多),如果我们只有几种条件需要随机,应该怎么做呢?
我们可以将得到的数进行乘法运算,例如乘以100,这样得到的数就会有整数位.方便进行判断
例: 随机数只有1,2,3
double num = Math.random(); //这里的(int) 代表强制转换(后面学到) //现在简单理解,我们生成的数是小数 //加了(int)后(num * 100)的小数位全部去掉(变为了整数) int n = ((int)(num * 100) % 3); //n 的最终结果只会为 0或者1或者2,因为模了3(取余数) if (n == 0) { System.out.println("n=0"); } else if (n == 1) { System.out.println("n=1"); } else if (n == 2) { System.out.println("n=2"); } else { System.out.println("开挂了吧"); }
结果如下(只出现了 0,1,2)
Random 类
在 Java 中,有一个专门用于随机数的类 Random,
Random 类在 java.util 包下(我们使用的时候和Scanner一样,需要导入)
导入 Random 类,在Java文件的最顶端 加入 import java.util.Random;
创建Random
与 Scanner 类似,代码为
Random random = new Random();
使用Random生成随机数
使用 nextInt(i) 方法,可以生成 0 到 i 之间的随机整数(不包含 i),
- 例
- 生成 0-5 之间的数
- Random.nextInt(6);
- 生成 0-9 之间的数
- Random.nextInt(10);
- 生成 0-5 之间的数
Random 类不仅可以生成随机数(小数,整数) 还可以随机 boolean,使用nextBoolean()方法
时间戳形式生成随机数
生成随机数的方法有很多种,利用不确定的因素就可以轻松达到随机的需求(上面两种形式用到的比较多)
对于不确定的因素,时间就是一种,时间他是会一直改变的(增加),有年月日小时分钟毫秒...
什么是时间戳? 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据
简单理解就是时间的数字表示形式....
那么,我们怎么获取到时间戳? 在Java中也有几种方法,这里列举最简单的一种
使用 System.currentTimeMillis();
这么一串很大的数字,我们同样可以使用 取余 的方法来获取指定值.
例如我们只想随机到 1,2,3
//获取当前的时间戳(每次获取都会不一样,因为时间是一直增长的) int num = System.currentTimeMillis(); //这里获取到的值为 0,1,2 我们想要获取到 1,2,3 怎么办? int n = num % 3; //很简单,在原来的结果上 +1 就可以了 n++;
实践
在之前的目录下新建一个文件夹,并且新建一个 java 文件
写好 main.
通过以上生成随机数的方法生成 0-2 的随机数
并将生成的随机数进行求平均(整数)得出最后的结果
最终结果
为 0(因为求平均数,相加为0,1,2都为0)
为 1(相加为3,4,5)
概率最低为 2(相加为 6 也就是三个数都为 2)
练习(掷骰子游戏)
制作一个掷骰子游戏,大致内容如下
游戏开始,主角可以轻松看到自己的 金额 信息(使用输出 + 变量),默认有 100 金币.
主角可以掷骰子,并进行对应功能.
主角掷骰子后,人机开始掷骰子(回合制)
胜利条件
- 简单的
- 玩家和人机 哪个金币先超过1000就算胜利
- 增加趣味性的(对于新手难度比较大,下面的骰子功能自己思考添加)
- 玩家和人机都有对应血量,掷骰子有功能可以消耗金币攻击对方,或者直接攻击,谁血量先少于0则谁输
骰子有 1,2,3,4,5,6 六个点数,每一个点数对应一个功能.
- 增加80金币
- 交给对方30金币(金币 - 30)
- 休息(不做操作)
- 这个实现其实就是没有这个选项(不需要判断随机数是否为3,或者随机数为3里面不写代码)
- 挖对方墙角(金币持续三回合减少,每回合-20)
- 这个实现 使用一个变量用来计数,在每回合执行操作前判断这个变量是否不为0(为0则代表没有这个效果),不为0则减少金币,并提示.(执行完后记得将变量的值 - 1)
- 都增加 50 金币
- 都减少 50 金币