在实际开发中产生随机数的使用普遍存在,所以在程序中进行产生随机数操作很重要。在 Java 中主要提供了两种方式产生随机数,分别为调用 Math 类的 random() 方法和 Random 类提供的产生各种数据类型随机数的方法。
1.1 Math.random() 方法
在 Math 类中存在一个 random 方法,用于产生随机数字,这个方法默认生成大于等于 0.0 小于1.0 的 double 型随机数,即 0 <= Math.random() < 1.0 ,虽然 Math.random() 方法只可以产生 0 ~ 1 之间的 double 型数字,其实只要在 Math.random() 语句上稍加处理,就可以使用这个方法产生任意范围的随机数。
(int)(Math.Random() * n) 返回大于等于 0 小于 n 的随机数
m + (int)(Math.Random() *n) 返回大于等于 m 小于 m+n (不包括 m+n )的随机数
eg :创建类,在类中编写 GetEvenNum() 方法产生两数之间的随机数,并在主方法中输出这个随机数。
public class MathRandom {
/**
* 定义产生偶数的方法
* @param num1 起始范围参数
* @param num2 终止范围参数
* @return 随机的范围内偶数
*/
public static int GetEvenNum(double num1 , double num2) {
//产生 num1 ~ num2 之间的随机数
int s = (int)num1 + (int)(Math.random() * (num2-num1));
if(s%2 == 0) { //判断随机数是否为偶数
return s; //返回
}else { //结果为奇数
return s + 1; //将结果+1返回
}
}
public static void main(String[] args) {
//调用产生随机数方法
System.out.println("任意一个 2 ~ 32 之间的偶数:"+GetEvenNum(2, 32));
}
}
运行结果为 :
任意一个 2 ~ 32 之间的偶数:6
每次运行大的结果都不相同,这就实现了随机产生数据的功能,病区每次产生的值都是偶数。为了实现这个功能,这里定义了一个方法 GetEvenNum() ,该方法的残花分别为产生随机数字的上限与下限。因为 m+(int)(Math.random()*n) 语句可以获取 m ~ m+n 之间的随机数,所以 “ 2+(int)(Math.random()*(32-2)) ” ,这个表达式就可以求出 2~32 之间的随机数。当获取到这个区间的随机数以后需要判断这个数字是否为偶数时,对该数字做对2取余操作即可。如果该数为奇数,则将该奇数+1 后返回也可得到偶数。
使用 Math 类的 random() 方法也可以随机生成字符,可以使用如下代码生成 a~z 之间的字符
(char)('a' + Math.random()*('z' - 'a' + a));
通过上述表达式可以求出更多的随机字符,如 A ~ Z 之间的随机字符,进而推理出任意两个字符之间的随机字符,可以使用一下语句表示 :
(char)(char1 + Math.random()*(char2 - char1 + 1));
eg : 创建类,在类中编写 GetReandomChar() 方法产生随机字符,并在主方法中输出该字符。
public class MathRandomChar {
//定义获取任意字符之间的随机字符
public static char GetRandomChar(char char1, char char2) {
return (char)(char1 + Math.random()*(char2 - char1 + 1));
}
public static void 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'));
}
}
运行结果为 :
任意小写字符:l
任意大写字符:P
0 到 9 任意数字字符:1
random() 方法返回的值实际上是伪随机数,它通过复杂的运算而得到一系列的数。该方法时通过当前时间作为随机数生成器的参数,所以每次执行程序都会产生不同的随机数。
1.2 Random 类
除了 Math 类中的 random() 方法可以获取随机数之外, Java 中还提供了一种可以获取随机数的方式,那就是 java.util.Random 类。可以通过实例化一个 Random 对象创建一个随机数生成器。
语法如下 :
Random r = new Random();
其中 : r 是指 Random 对象。
以这种方式实例化对象时, Java 编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间不可能相同,所以产生的随机数将不同,但是如果运行速度太快,也会产生两次运行结果相同的随机数。
同时也可以在实例化 Random 对象时,设置随机数生成器的种子。
语法如下 :
Random r = new Random(seedValue);
r : Random 类对象
seedValue :随机数生成器的种子
在 Random 类中提供了获取各种数据类型随机数的方法,下面列举几个常用的方法:
public int nextInt() : 返回一个随机整数
public int nextInt(int n) : 返回大于等于 0 小于 n 的随机整数
public long nextLong() : 返回一个随机长整型值
public boolean nextBoolean() : 返回一个随机布尔型值
public float nextFloat() : 返回一个随机浮点型值
public double nextDouble() : 返回一个随机双精度型值
public double nexGaussian() : 返回一个概率密度为高斯分布的双精度值
eg : 创建类,在累的主方法中创建 Random 的对象,使用该对象生成各种类型的随机数,并输出结果。
import java.util.Random; //导包
public class RandomDemo {
public static void main(String[] args) {
Random random = new Random(); //实例化一个 Random 类
System.out.println("随机产生一个整数:" + random.nextInt());
System.out.println("随机产生一个大于等于 0 小于 10 的整数:" + random.nextInt(10));
System.out.println("随机产生一个布尔型值:" + random.nextBoolean());
System.out.println("随机产生一个双精度型的值:" + random.nextDouble());
System.out.println("随机产生一个浮点型的值:" + random.nextFloat());
System.out.println("随机产生一个概率密度为高斯分布的双精度值:" + random.nextGaussian());
}
}
运行结果为:
随机产生一个大于等于 0 小于 10 的整数:5
随机产生一个布尔型值:false
随机产生一个双精度型的值:0.4923202923804435
随机产生一个浮点型的值:0.6521005
随机产生一个概率密度为高斯分布的双精度值:-0.2458356560206751