在软件开发编程中,我们经常需要生成一个随机数值。比如在1~100的整型范围内生成一个随机数。幸运的是,由于在Java API中提供了生成随机数的类,可以通过java.util.Random类、Math.random工具方法和ThreadLocalRandom类快速地生成一个伪随机数。在Java中的工具方法random()生成随机数更加方便,它只返回一个随机的浮点数,另一方面通过使用Random,你可以生成一个伪随机整型或者浮点型的数值。在这篇文章中,将会讨论在Java中如何生成一个随机数,用例子说明产生随机整型和实数、在给定的范围内生成随机一个数,同时还将探讨java.util.Random类和Math.random()之间的区别。
通过例子在解释Java如何生成随机数
在前面的简介中提到Java中的Random类被用来创建一个随机数,通过默认的种子,你可以创建一个Random类的实例,或者提供你自己的种子创建一个定制的Random实例,Random(long seed)。这个类提供了返回随机整型、浮点型和布尔型的方法。
Random random = new Random()
for(int i=0;i<5; i++){
int randomInteger = random.nextInt();
System.out.printIn("Random Integer in java:" + randomInteger);
}
Output:
Random Integer in java -1194538938
Random Integer in java -973476571
Random Integer in java -1283186469
Random Integer in java 117667327
Random Integer in java 265551019
Random random = new Random()
for(int i=0;i<5; i++){
int randomInteger = random.nextInt();
System.out.printIn("Random Integer in java:" + randomInteger);
}
Output:
Random Integer in java -1194538938
Random Integer in java -973476571
Random Integer in java -1283186469
Random Integer in java 117667327
Random Integer in java 265551019
使用Java中整型的数值范围(-2^31~2^31-1由正数和负数组成),Random类默认在这个数值范围内生成一个随机数。同样地,你可以使用Math.random()方法创建一个随机数。
for(int i=0; i<3; i++){
double randomDouble = Math.random();
System.out.println("Random Number in java:" + randomDouble);
}
Output:
Random Number in Java: 0.767752638941705
Random Number in Java: 0.482517390182052
Random Number in Java:0.282439118792283
for(int i=0; i<3; i++){
double randomDouble = Math.random();
System.out.println("Random Number in java:" + randomDouble);
}
Output:
Random Number in Java: 0.767752638941705
Random Number in Java: 0.482517390182052
Random Number in Java:0.282439118792283
如何生成整型数值
如果你想在两个整型数值的范围内生成一个随机整数,建议使用random.nextInt()方法,该方法将返回等可能性的全部整型。你也可以使用Math.random()方法先生成一个随机的浮点数,然后再转化为整型,综上所述,你有两种方式生成随机数整数
如何生成浮点型数值
与生成整型数值相似,这里用到的是Random类中的nextDuoble()方法,此方法返回0.0~1.0之间的伪随机浮点数。
如何生成布尔型
使用Random类中的nextBoolean()方法生成一个布尔型的值。
在给定的两个数之间随机生成一个数
使用Math.random()方法和Random类可以在一个范围中生成随机数。大多数时候,我们仅需要整型而不是Math.random()方法生成的随机浮点型,所以需要对浮点型进行更改为整型。
for(int i =0; i<3; i++){
int randomInteger = random.nextInt(10);
System.out.println("pseudo random int in a range : " + randomInteger);
}
Output:
pseudo random int in a range : 7
pseudo random int in a range : 1
pseudo random int in a range : 3
for(int i =0; i<3; i++){
int randomInteger = random.nextInt(10);
System.out.println("pseudo random int in a range : " + randomInteger);
}
Output:
pseudo random int in a range : 7
pseudo random int in a range : 1
pseudo random int in a range : 3
Random.nextInt(10)方法的返回值是0<=x<10之间的一个随机数。
在0~10之间的随机数
下面的代码段能够生成一个x,x的取值范围为:0<=x<10。由于使用了Math.random()方法,返回值为0~1.0。
for(int i =0; i<3; i++){
int randomInt = (int)(10.0 * Math.random());
System.out.println("pseudo random int between 1 and 10 : " + randomInt );
}
Output:
pseudo random int between 1 and 10 : 4
pseudo random int between 1 and 10 : 0
pseudo random int between 1 and 10 : 2
Read more: http://javarevisited.blogspot.com/2013/05/how-to-generate-random-numbers-in-java-between-range.html#ixzz2zJWpxdHB
for(int i =0; i<3; i++){
int randomInt = (int)(10.0 * Math.random());
System.out.println("pseudo random int between 1 and 10 : " + randomInt );
}
Output:
pseudo random int between 1 and 10 : 4
pseudo random int between 1 and 10 : 0
pseudo random int between 1 and 10 : 2
Read more: http://javarevisited.blogspot.com/2013/05/how-to-generate-random-numbers-in-java-between-range.html#ixzz2zJWpxdHB
Math.random()方法和Random类不同点
使用这两种方式都可以生成一个随机数,但是两者之间的用法和表现形式还是有一点区别的。
- 为了生成一个随机数,实际上这些都是为随机数,使用Random类,你需要创建该类的一个实例;对于Math.random()方法,第一次调用该方法时会创建一个新的伪随机数生成器,用表达式表示如:new java,util.Random()。这个伪随机数生成器等同于new Random(),并且仅在这能被使用。
- Random类支持生成随机整型、浮点型和布尔型,而Math.rand()方法仅支持生成一个在0.0~1.0之间的浮点型数值。
- 使用Math.random()方法时,我们不能更改生成随机数的种子,它是在任意一个Math实例调用该方法时创建的。这个方法为同步的,这意味着允许在多线程环境下使用,随着线程数的增加,会导致资源竞争。通常在多线程环境下同时想创建随机数,土建使用ThreadLocalRandom,提高程序的性能。
- Math.random()方法是一个工具方法,Random类才是真正的随机数生成数,它提供了一系列方法用以生成不同类型的数据类型。
总结
- 在Java中生成随机数可用三种方式:Random类、ThreadLocalRandom类或者Math.random()方法。
- Random类能生成整型、浮点型或布尔型。
- 生成的随机数是伪随机数,
- Math.random()仅生成0.0~1.0之间的浮点类型数值。
- Math.random()是线程安全方法,在多线程环境下能够被调用。但是为了降低资源竞争而把随机数生成器分开不是一种明智的做法。在jdk1.7中,如果你想在多线程最后那个共享随机数生成数,ThreadLocalandom类为不错的选择。
- 尽管随机数接受一个长整型的种子(64bits),但只使用了48bits生成随机数。
- Random类不是final类,你可以继承实现你自己的算法。
- 使用Math.random()方法容易和方便的创建随机数。