在实际开发中生成随机数的使用是很普遍的,所以在程序中生成随机数的操作很重要。在Java中主要提供了两种方式生成随机数,分别为调用Math类的random()方法和Random类提供的生成各种数据类型随机数的方法,下面分别进行讲解。
Math.random()方法
在Math类中存在一个random()方法,用于生成随机数字,该方法默认生成大于等于0.0小于1.0的double型随机数,即0<=Math.random()<1.0,虽然Math.random()方法只可以生成0~1之间的double型数字,但只要在Math.random()语句上稍加处理,就可以使用这个方法生成任意范围的随机数,如图9.11所示。
图9.11 使用random()方法示意图
为了更好地解释这种生成随机数的方式,下面举例说明。
【例9.10】使用Math.random()方法实现一个简单的猜数字小游戏,要求:使用Math.random()方法生成一个0——100之间的随机数字,然后用户输入猜测的数字,判断输入的数字是否与随机生成的数字匹配,如果不匹配,提示相应的信息,如果匹配,则表示猜中,游戏结束。代码如下:
public class NumGame { public static void main(String[] args) { System.out.println("——————猜数字游戏——————\n"); int iNum; int iGuess; Scanner in = new Scanner(System.in); // 创建扫描器对象,用于输入 iNum = (int) (Math.random() * 100); // 生成0到100之间的随机数 System.out.print("请输入你猜的数字:"); iGuess = in.nextInt(); // 输入首次猜测的数字 while ((iGuess != -1) && (iGuess != iNum)) // 判断输入的数字不是-1或者基准数 { if (iGuess < iNum) // 若猜测的数字小于基准数,则提示用户输入的数太小,并让用户重新输入 { System.out.print("太小,请重新输入:"); iGuess = in.nextInt(); } else // 若猜测的数字大于基准数,则提示用户输入的数太大,并让用户重新输入 { System.out.print("太大,请重新输入:"); iGuess = in.nextInt(); } } if (iGuess == -1) // 若最后一次输入的数字是-1,循环结束的原因是用户选择退出游戏 { System.out.println("退出游戏!"); } else // 若最后一次输入的数字不是-1,用户猜对数字,获得成功,游戏结束 { System.out.println("恭喜你,你赢了,猜中的数字是:" + iNum); } System.out.println("\n———————游戏结束———————"); } }
在Eclipse中运行本实例,结果如图9.12所示。
图9.12猜数字游戏
除了随机生成数字以外,使用Math类的random()方法还可以随机生成字符,例如,可以使用下面代码生成a~z之间的字符:
(char)(‘a‘+Math.random()*(‘z‘-‘a‘+1));
通过上述表达式可以求出更多的随机字符,如A~Z之间的随机字符,进而推理出求任意两个字符之间的随机字符,可以使用以下语句表示:
(char)(cha1+Math.random()*(cha2-cha1+1));
在这里可以将这个表达式设计为一个方法,参数设置为随机生成字符的上限与下限。下面举例说明。
【例9.11】在项目中创建MathRandomChar类,在类中编写GetRandomChar()方法生成随机字符,并在主方法中输出该字符。
publicclass MathRandomChar { //定义获取任意字符之间的随机字符 publicstaticchar GetRandomChar(char cha1, char cha2) { return (char) (cha1 + Math.random() * (cha2 - cha1 + 1)); } publicstaticvoid main(String[] args) { //获取a~z之间的随机字符 System.out.println("任意小写字符" + GetRandomChar(‘a‘, ‘z‘)); //获取A~Z之间的随机字符 System.out.println("任意大写字符" + GetRandomChar(‘A‘, ‘Z‘)); //获取0~9之间的随机字符 System.out.println("0到9任意数字字符" + GetRandomChar(‘0‘, ‘9‘)); } }
在Eclipse中运行本实例,运行结果如图9.13所示。
图9.13获取任意区间的随机字符
Random类
除了Math类中的random()方法可以获取随机数之外,Java中还提供了一种可以获取随机数的方式,那就是java.util.Random类,该类表示一个随机数生成器,可以通过实例化一个Random对象创建一个随机数生成器。语法如下:
Random r=new Random();
其中,r是指Random对象。
以这种方式实例化对象时,Java编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间不可能相同,所以生成的随机数将不同,但是如果运行速度太快,也会生成两次运行结果相同的随机数。
同时也可以在实例化Random类对象时,设置随机数生成器的种子。
语法如下:
Random r=new Random(seedValue);
t r:Random类对象。
t seedValue:随机数生成器的种子。
在Random类中提供了获取各种数据类型随机数的方法,其常用方法及说明如表9.11所示。
表9.11 Random类中常用的获取随机数方法
方法 |
返回值 |
功能描述 |
nextInt() |
int |
返回一个随机整数 |
nextInt(int n) |
int |
返回大于等于0小于n的随机整数 |
nextLong() |
long |
返回一个随机长整型值 |
nextBoolean() |
boolean |
返回一个随机布尔型值 |
nextFloat() |
float |
返回一个随机浮点型值 |
nextDouble() |
double |
返回一个随机双精度型值 |
nextGaussian() |
double |
返回一个概率密度为高斯分布的双精度值 |
【例9.12】使用Random类模拟微信的抢红包功能,具体实现时,在项目中创建RedBags类,然后根据用户输入的红包额度和个数随机生成每个红包的金额。代码如下:
import java.util.Random; import java.util.Scanner; publicclass RedBags { // 创建一个RedBags类 publicstaticvoid main(String[] args) { System.out.println("—————————模拟微信抢红包—————————\n"); Scanner sc = new Scanner(System.in); // 控制台输入 System.out.print("请输入要装入红包的总金额(元):"); doubletotal = sc.nextDouble(); // 输入“红包的总金额” System.out.print("请输入红包的个数(个):"); intbagsnum = sc.nextInt(); // 输入“红包的个数” doublemin = 0.01; // 初始化“红包的最小金额” Random random = new Random(); // 创建随机数对象random for (inti = 1; i<bagsnum; i++) { // 设置“循环” /* * 通过公式模拟数学中的离散模型计算一个红包可以放的最大金额 * 本次红包可用最大金额 = 可分配金额 - (红包总数 * 已发出的红包数) * 红包的最小金额 */ doublemax = total - (bagsnum - i) * min; doublebound = max - min;// 设置随机金额的取值范围 /* * 据随机金额的取值范围,随机生成红包金额。 * 由于nextInt(int bound)只能用整型做参数,所以先将bound乘100(小数点向右挪两位) * 获取到一个整数后,将这个整数除100(小数点向左挪两位)并转换成与金额相同的浮点类型 */ doublesafe = (double) random.nextInt((int) (bound * 100)) / 100; doublemoney = safe + min;// 最后加上红包的最小金额,以防safe出现0值 total = total - money; // 替换total的值 System.out.println("第" + i + "个红包:" + String.format("%.2f", money) + "元"); } System.out.println("第" + bagsnum + "个红包:" + String.format("%.2f", total) + "元"); sc.close(); // 关闭控制台输入 } }
在Eclipse中运行本实例,运行结果如图9.14所示。
图9.14 模拟微信抢红包功能
本文摘自明日科技出版的《Java从入门到精通(项目案例版)》,转载请注明出处!!!