ThreadLocalRandom类是JDK7在JUC包下新增的随机数生成器,它解决了Random类在多线程下多个线程竞争内部唯一的原子性种子变量而导致大量线程自旋重试的不足。
常用方法:
public static void main(String[] args) {
//创建ThreadLocalRandom实例
ThreadLocalRandom random = ThreadLocalRandom.current();
//生成一个随机的boolean值,生成true和false的值几率相等,也就是都是50%的几率。
System.out.println(random.nextBoolean());
//生成一个随机的double值,数值介于[0,1.0)之间。
System.out.println(random.nextDouble());
//生成一个随机的double值,数值介于[0,5.0)之间。
System.out.println(random.nextDouble(5));
//生成一个随机的double值,数值介于[1,5.0)之间。
System.out.println(random.nextDouble(1, 5));
//生成在-2^31到2^31-1之间int值
System.out.println(random.nextInt());
//生成一个介于[0,n)的区间int值,包含0而不包含n
System.out.println(random.nextInt(10));
//生成在[a,b)之间int值
System.out.println(random.nextInt(1, 20));
//返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的float值
System.out.println(random.nextFloat());
//生成一个范围是-2^64到2^64-1的long值,它是取自此随机数生成器序列的均匀分布的long值。
System.out.println(random.nextLong());
//生成一个介于[0,n)的区间long值,包含0而不包含n
System.out.println(random.nextLong(20L));
//生成在[a,b)之间long值
System.out.println(random.nextLong(1L, 30L));
//返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的 double 值,其平均值是 0.0,标准差是 1.0。
System.out.println(random.nextGaussian());
//相同种子数的Random对象,相同次数生成的随机数字是完全相同的
//如果想避免出现随机数字相同的情况,则需要注意,无论项目中需要生成多少个随机数字,都只使用一个Random对象即可。
//特别说明:ThreadLocalRandom不允许重新设置种子数,即调setSeed()方法会抛异常
Random r1 = new Random(10);
Random r2 = new Random(10);
for (int i = 0; i < 2; i++) {
System.out.println(r1.nextInt() + "<->" + r2.nextInt());
}
}