Java的Random类详解
程序员文章站
2022-04-08 18:49:45
Random类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序员显示传入一个long型整数的种子。 Random类比Math类的random()方法提供了更多的方式来生成各种伪随机数,可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机 ......
random类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序员显示传入一个long型整数的种子。
random类比math类的random()方法提供了更多的方式来生成各种伪随机数,可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围。random类的常用用法如下示例:
public class test { public static void main(string[] args) { random rand = new random(); system.out.println("rand.nextboolean():" + rand.nextboolean()); // 生成0.0-1.0之间的伪随机double数 system.out.println("rand.nextdouble():" + rand.nextdouble()); // 生成0.0-1.0之间的伪随机float数 system.out.println("rand.nextfloat():" + rand.nextfloat()); // 生成一个处于int整数取值范围的伪随机数 system.out.println("rand.nextint():" + rand.nextint()); // 生成0-20之间的伪随机整数 system.out.println("rand.nextint(20):" + rand.nextint(20)); // 生成一个处于long整数取值范围的伪随机数 system.out.println("rand.nextlong():" + rand.nextlong()); } }
运行结果:
rand.nextboolean():false rand.nextdouble():0.642852533214433 rand.nextfloat():0.2703439 rand.nextint():1773302756 rand.nextint(20):3 rand.nextlong():1175156863283867437
从上面程序可以看出,random可以提供很多选项来生成伪随机数。
random使用一个48位的种子,如果这个类的两个实例是用同一个种子创建的,对它们的方法以同样的顺序调方法,则它们会产生相同的数字序列。也就是说,random产生的数字并不是真正的随机,而是一种伪随机。
为了避免两个random对象产生相同的数字序列,通常推荐使用当前时间作为random对象的种子,如下代码所示:
random rand = new random(system.currenttimemillis());
在并发访问的环境下,使用threadlocalrandom来代替random可以减少多线程资源竞争,最终保证系统具有更好的线程安全性。threadlocalrandom的用法与random基本相似,它提供了一个静态的current()方法来获取threadlocalrandom对象,获取该对象之后即可调用各种nextxxx()方法来获取伪随机数。下面代码示范了threadlocalrandom的用法:
threadlocalrandom rand = threadlocalrandom.current(); //生成一个5-20之间的随机数 int r1 = rand.nextint(5,20); //生成一个5.0-20.0之间的随机浮点数 double r2 = rand.nextdouble(5.0, 20.0);
上一篇: struts1的工作原理
推荐阅读