Java中Random()对象是生成随机数的对象。Random()有两种构造方法:
Random():创建一个新的随机数生成器,这种方式采用默认的种子。
Random(long seed):使用seed为种子创建一个新的随机数生成器。
种子的作用:我们在创建Random对象的时候,如果不设定种子,对象会采用默认的种子(默认当前系统时间的毫秒数为种子)。Random()对象生成的随机数是伪随机数(通过算法产生的随机数都是伪随机数),这就意味着如果我们知道了种子,或者已经产生的随机数,都可能获得接下来随机序列的信息(这样就使得随机数有了可预测性,如果种子数一样,则会生成相同的随机数,具体可以看:案例1)。只有通过真实的随机时间产生的随机数才是真随机。例如通过机器的硬件噪声来产生的随机数、通过当前环境pm10数据产生的随机数。虽然两种构造方法都是伪随机,但是无参的构造方法具有更强的随机性,能满足一般统计上的随机数要求。另外,种子数只是随机算法的起源数字,和生成的随机数没有任何关系,可以随意设置合法的种子数。
案例1:
// 种子数都设为6
Random numList = new Random(6);
Random numList2 = new Random(6);
// 随机生成10个随机数
for(int i=0; i<10; i++) {
//生成一个[0,10)之间的随机数
int num = numList.nextInt(10) ;
int num2 = numList2.nextInt(10) ;
System.out.println("num1 =" + num + ", num2 = " + num2);
}
案例2:
常用随机数的方法都是生成某个区间的随机数
Random numList = new Random();
// 随机生成10个随机数
System.out.println("生成一个[50,100)之间的随机数:");
for(int i=0; i<10; i++) {
//生成一个[50,100)之间的随机数
int num = numList.nextInt(50) + 50 ;
System.out.print(num + " ");
}
// 生成一个[50,100)之间的随机数:
// 96 73 76 95 71 78 77 88 66 92
注意:Random()生成的随机数不能保证重复的数据,如果需要生成重复的数据,则需要跟集合配置使用。
案例三:
/**
* 生成一个特定格式的字符串数组
* 字符串格式为:
* 1,特定字符串头:YGMANG
* 2,6个数字+字母的随机大写字符
* 3,目前的时间戳:时间格式为yyyyMMddHHmmss
*/
@Test
public void arrayTest() {
StringBuffer flag = new StringBuffer(); //定义一个边长的字符串对象
String headNUm = "YGWNGX"; //设置字符串固定头
flag.append(headNUm);
String sources = "0123456789ABCDEFIJKLMNOPQRSTUVWXYZ"; //定义一个数字+字母的字符串
Random rand = new Random();
SimpleDateFormat myFmt = new SimpleDateFormat("yyyyMMddHHmmss");//规定生成时间戳的格式
for (int j = 0; j < 6; j++)
{
flag.append(sources.charAt(rand.nextInt(sources.length())));
}
Date date = new Date();
flag.append(myFmt.format(date));
System.out.println("生成的随机字符串为:" + flag.toString());
/**
* 生成的结果为:
* 生成的随机字符串为:YGWNGXOKW9DK20191017091540
*/
}
Random9()方法摘要:
Java.util.Random()方法摘要: | ||
方法 | 返回值 | 解释 |
next(int bits) | int | 生成下一个伪随机数。 |
nextBoolean() | boolean | 返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值。 |
nextBytes(byte[] bytes) | void | 生成随机字节并将其置于用户提供的 byte 数组中。 |
nextDouble() | double | 返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的 double值 |
nextFloat() | float | 返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布float值。 |
nextGaussian() | double | 返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的double值,其平均值是0.0标准差是1.0。 |
nextInt() | int | 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。 |
nextInt(int n) | int | 返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的int值。 |
nextLong() | long | 返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。 |
setSeed(long seed) | void | 使用单个 long 种子设置此随机数生成器的种子 |
给出几个例子:
1.生成[0,1.0)区间的小数:double d1 = r.nextDouble();
2.生成[0,5.0)区间的小数:double d2 = r.nextDouble() * 5;
3.生成[1,2.5)区间的小数:double d3 = r.nextDouble() * 1.5 + 1;
4.生成-231到231-1之间的整数:int n = r.nextInt();
5.生成[0,10)区间的整数:
int n2 = r.nextInt(10);//方法一
n2 = Math.abs(r.nextInt() % 10);//方法二