在实际开发中生成随机数的使用是很普遍的,所以在程序中生成随机数的操作很重要。在Java中主要提供了两种方式生成随机数,分别为调用Math类的random()方法和Random类提供的生成各种数据类型随机数的方法,下面分别进行讲解。
9.3.1 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 {
publicstatic void main(String[] args) {
System.out.println("——————猜数字游戏——————\n");
intiNum;
intiGuess;
Scannerin = 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()方法生成随机字符,并在主方法中输出该字符。
在Eclipse中运行本实例,运行结果如图9.13所示。
图9.13获取任意区间的随机字符
publicclass MathRandomChar {
//定义获取任意字符之间的随机字符
publicstaticchar GetRandomChar(charcha1, 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'));
}
}
Random类
除了Math类中的random()方法可以获取随机数之外,Java中还提供了一种可以获取随机数的方式,那就是java.util.Random类,该类表示一个随机数生成器,可以通过实例化一个Random对象创建一个随机数生成器。语法如下:
Randomr=new Random();
其中,r是指Random对象。
以这种方式实例化对象时,Java编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间不可能相同,所以生成的随机数将不同,但是如果运行速度太快,也会生成两次运行结果相同的随机数。
同时也可以在实例化Random类对象时,设置随机数生成器的种子。
语法如下:
Randomr=new Random(seedValue);
þ r:Random类对象。
þ 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类,然后根据用户输入的红包额度和个数随机生成每个红包的金额。代码如下:
importjava.util.Random;
importjava.util.Scanner;
publicclassRedBags { // 创建一个RedBags类
publicstaticvoidmain(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 模拟微信抢红包功能
感谢读者朋友对明日科技的支持,如果您对图书中的讲解及光盘源码有任何问题,可以直接登录http://www.mingrisoft.com上的社区进行发贴,把您的问题详细的说明一下,我们的技术人员会在那里给您回复!
本文摘自明日科技出版的《Java从入门到精通(项目案例版)》,转载请注明出处!!!