在程序中,有时需要生成随机数,这是不可避免的,但在java中我们应该如何生成我们所需要的随机数呢?
java为我们生成随机数提供了两种方式:一种是类Math,一种是类Random。
接下来我们来了解一下这两个类是如何使用的:
Math类:
public static synchronized doublerandom()
Returns a pseudo-random double n
, where n >= 0.0 && n < 1.0
. This method reuses a single instance ofRandom
. This method is thread-safe because access to theRandom
is synchronized, but this harms scalability. Applications may find a performance benefit from allocating aRandom
for each of their threads.
以上是api中解释,random()方法是类Math的一个静态方法。Math.random()能够为我们生成一个double型的随机数,这个随机数的范围为大于等于0.0,少于1.0。
由以上解释,生成0到1的随机数,有时不满足我们的需求。比如说我们要生成0到100的整数,如下:
int random = (int)(Math.random()*100);//注意,这里不是(int)Math.random()*100,否则会生成的随机数一直为0,因为0到1之间的小数强制转换为整数不会进行四舍五入会直接取整。所以这里根据需求来生成我们需要的随机数。
Random类:
首先Random类从字面上理解为随机的意思,也就是能为我们生成我们需要的随机数。
我们来看看是如何使用的:
Random r = new Random();
for(int i = 0; i < 10; i++){
System.out.print("bool:" + r.nextBoolean() + " ");
System.out.print("double:" + r.nextDouble() + " ");
System.out.print("float:" + r.nextFloat() + " ");
System.out.print("gaussian:" + r.nextGaussian() + " ");
System.out.print("int:" + r.nextInt() + " ");
System.out.print("long:" + r.nextLong() + " byte: ");
byte []b = new byte[10];
r.nextBytes(b);
for(int j = 0; j < 10; j++)
System.out.print((byte)b[j] + " ");
System.out.println();
}
上述代码的测试结果如下:
我们可以看出Random类在它的这几个方法中可以生成下负数。
r.nextBoolean()生成bool型true或false。
r.nextDouble()生成double型随机数,double的取值范围是[0, 1)。
r.nextFloat()生成float型随机数,flaot的取值范围是[0,1)。
r.nextGaussian()生成double型随机数, double的取值范围是gaussian类型的范围。
r.nextInt()生成int型随机数, int的取值范围是正负数的int型的范围。
r.nextLong()生成long型随机数,long的取值为long型数据。
r.nextbyte(byte[])生成byte型随机数数组,其数组中为byte型大小的数,有正负数。
Random类还有一个构造方法Random(int seed),seed为种子的意思。
Random r1 = new Random(20);
r1.nextInt(100); //可以生成[0,100)的随机整数,这个方法在上面没有说明,因为这里用到了seed,在这里new Random(20)中的20没起到直接作用,但并不是没起到作用。我们看看以下测试结果。
Random r1 = new Random(20);
Random r2 = new Random(20);
for(int i = 0; i < 10; i++){
System.out.println("i1:" + r1.nextInt(100) + " i2:"+ r2.nextInt(100) );
}
测试结果:
我们发现这两个对象r1,r2生成的随机数是一样的。
那我们再换种方式:
Random r1 = new Random();
Random r2 = new Random(20);
for(int i = 0; i < 10; i++){
System.out.println("i1:" + r1.nextInt(100) + " i2:"+ r2.nextInt(100) );
}
测试结果:
我们发现生成的随机数就不一样了。
所以不同的种子seed对生成的随机数也会产生影响。
总结:以上我们会发现Random类使用起来比Math类要复杂点,但总体说我们可以根据具体需求选择那种方式。
+_+ @ a little a day