Random 类的实例用于生成伪随机数。其在 java.util 包下,前几节的类都在 java.lang 包下,因此我们在创建 Random 对象时需要在类名上面导入包名( import java.util.Random )。
Random 类使用线性同余公式修正的48位种子。只有使用相同种子创建、并且执行相同的方法调用序列的两个随机实例,才能生成并返回相同的数字序列。
*** Random* 类** 实现的算法使用一个受保护的使用方法,每次调用可以提供多达32位伪随机生成数。
注: java.util.Random 的实例在密码学上不安全。对于敏感的应用程序,应该考虑使用 SecureRandom 类来获取加密安全的随机数生成器。
1. 构造函数
/*
* Random() 无参构造器
*/
Random random = new Random();
/*
* Random(long seed) 带长整型参数的构造器
*/
long seed = 45687;
Random randomBySeed = new Random(seed);
2. 方法概述
-
设置随机数种子值
/*
* 使用长整型(long)种子设置此随机数的种子值。
* 其将种子值更新为(种子^0x5DEECE66DL) & ((1L << 48) - 1)
* 并清除nextGaussian()使用的haveNextNextGaussian标志。
*/
Random r = new Random();
r.setSeed(89999);
System.out.println(r.nextInt());
-
生成下一个伪随机数
/*
* 生成[0,10]区间的整数。
* 由于next(int bits)是 protected (相对其他类是私有类,相对子类或姐妹类是公共的),因此其他类需要根据数据类型调用相关方法。
* nextBytes(byte[] bytes)
* nextInt() & nextInt(int bound)
* nextLong()
* nextBoolean()
* nextFloat()
* nextDouble()
*/
Random random = new Random();
System.out.println(random.nextInt(10));
3. 与Math类中的random()方法的区别
- Math.Random() 返回带正号的double值,其值大于0.0,小于1.0。Math.Random() 是同步的,允许多个线程同时使用。
- java.util.Random 类生成随机数时,首先创建该类的实例对象。如果调用无参构造器,Java编辑器以系统当前时间作为随机数的种子值,因为每时每刻的时间不相同,所以产生的随机数也不同。但不排除运行速度过快,导致两次随机数相同的几率。也可以在实例化时自定义种子值,如果种子值相同,则随机数也完全相同。
网友评论