Java中存在着两种Random函数:
一、java.lang.Math.Random
Math.random()方法生成大于等于0.0且小于1.0的double型随机数(0.0<=Math.random<1.0),返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。举一个小例子:
public class Demo {
public static void main(String[] args) {
for (int i = 0; i < 6; i++) {
int r = (int) (Math.random() * 100);
System.out.println("number is " + r);
}
}
}
注意:Math.Random()函数返回的是double类型的值,所以在要赋值给其他类型的变量的时候注意需要进行类型转换。
此方法是完全同步的,可允许多个线程使用而不出现错误。但是,如果许多线程需要以极高的速率生成伪随机数,那么这可能会减少每个线程对拥有自己伪随机数生成器的争用。
二、java.util.Random
- java.util.Random类中实现的随机算法也是伪随机的,Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;
- 相同种子数的Random对象,相同次数生成的随机数字是完全相同的。
Random()的两种构造方法:
- Random():以当前时间作为种子创建一个Random对象,并且采用线性同余法计算下一个随机数。
- Random(long seed):使用特定值作为种子创建一个Random对象。
提示:种子是一个用于初始化一个随机数字生成器的数字,如果两个Random对象有相同的种子,那它们会产生相同的数列。
方法 | 说明 |
---|---|
nextInt( ) : int | 返回一个随机的int值 |
nextInt(n : int): int | 返回一个0到n(不包含n)之间的随机int类型的值 |
nextLong( ) : long | 返回一个随机的long值 |
nextFloat( ) : float | 返回一个0.0到1.0(不包含1.0F)之间的随机float类型的值 |
nextDouble( ) : double | 返回一个0.0到1.0(不包含1.0)之间的随机double类型的值 |
nextBoolean( ) : boolean | 返回一个随机的boolean值 |
举一个小例子:
import java.util.Random;
public class Demo {
public static void main(String[] args) {
Random random1 = new Random(100);
System.out.print("random1: ");
for (int i = 0; i < 10; i++) {
System.out.print(random1.nextInt(1000) + " ");
}
System.out.println();
Random random2 = new Random(100);
System.out.print("random2: ");
for (int i = 0; i < 10; i++) {
System.out.print(random2.nextInt(1000) + " ");
}
}
}
它产生相同的int类型的随机数列:
最后简单对比一下这两个随机函数的特点:
1. java.Math.Random()实际是在内部调用java.util.Random()的;
2. java.util.Random()在调用的时候可以实现和java.Math.Random()一样的功能,而且它有更多的调用方法,相对来说比较灵活;
3. 二者都是弱随机数,弱伪随机数PRNG实现 java.util.Random类,默认使用当前时间作为种子,并且采用线性同余法计算下一个随机数;强伪随机数RNG实现java.security.SecureRandom类,该类使用临时文件夹中大小,线程休眠时间等的值作为随机数种子。