撰写时间:2019年04月26日
Random类是专门用来生成一个伪随机数的类,它产生的随机数是根据种子和顺序决定
的,当种子或者顺序两个因素其中一个改变时,那么Random类产生的伪随机数就会发
生改变。
Random产生的数字并不是真正的随机的,而是一种伪随机,为什么说Random类产生的
随机数是伪随机数,因为它根据调用的顺序以及种子来确认它的随机的,它内部就是一
个固定的算法,这个算法需要种子作为参数,以及它调用的顺序,因为它调用了不同的
list,里面会进行不同的运算。不同的运算就会去修改它那个种子原生的运算。
下面会有例子展示:
普通展示各类型的随机数:
Random random = new Random();
// Boolean
// 每次执行 都有可能是false 或 true
System.out.println("random.nextBoolean()=" + random.nextBoolean());
// 数组 、随便给个长度
byte[] bs = new byte[5];
random.nextBytes(bs);
System.out.println("random.nextBytes(bs)=" + Arrays.toString(bs));
// 生成0.0~1.0之间的伪随机double数
System.out.println("random.nextDouble() = " + random.nextDouble());
// 生成0.0~1.0之间的伪随机float数
System.out.println("random.nextFloat() = " + random.nextFloat());
// 生成平均值是 0.0,标准差是 1.0的伪高斯数
System.out.println("random.nextGaussian() = " + random.nextGaussian());
// 生成一个处于int整数取值范围的伪随机整数
System.out.println("random.nextInt() = " + random.nextInt());
// 给指定范围的伪随机整数,不管执行多少次生成的整数都在0~20之间
// 生成0~20之间的伪随机整数
System.out.println("random.nextInt(20) = " + random.nextInt(20));
// 生成一个处于long整数取值范围的伪随机整数
System.out.println("random.nextLong() = " + random.nextLong());
下面结果显示,执行了两次都是不一样的,虽然看起来像是随机的,但却不完全是随机的,
下面在写一个例子对比:
//一样的种子
long longValue = System.currentTimeMillis();
Random random1 = new Random(longValue);
System.out.println("第一个种子为longValue的Random对象");
System.out.println("random1.nextBoolean()=" + random1.nextBoolean());
System.out.println("random1.nextDouble() = " + random1.nextDouble());
System.out.println("random1.nextFloat() = " + random1.nextFloat());
System.out.println("random1.nextGaussian() = " + random1.nextGaussian());
System.out.println("random1.nextInt() = " + random1.nextInt());
Random random2 = new Random(longValue);
System.out.println("第二个种子为longValue的Random对象");
System.out.println("random2.nextBoolean()=" + random2.nextBoolean());
System.out.println("random2.nextDouble() = " + random2.nextDouble());
System.out.println("random2.nextFloat() = " + random2.nextFloat());
System.out.println("random2.nextGaussian() = " + random2.nextGaussian());
System.out.println("random2.nextInt() = " + random2.nextInt());
Random random3 = new Random(longValue);
System.out.println("第三个种子为longValue的Random对象");
System.out.println("random3.nextBoolean()=" + random3.nextBoolean());
System.out.println("random3.nextDouble() = " + random3.nextDouble());
System.out.println("random3.nextFloat() = " + random3.nextFloat());
System.out.println("random3.nextGaussian() = " + random3.nextGaussian());
System.out.println("random3.nextInt() = " + random3.nextInt());
(第一图)现在是种子顺序一样的,所以生成的随机数都是一样的,
(第二图)当把顺序改变了,那么生成的随机数就不一样了