Java Math.random

Java Math.random,Java中,对随机最基本的支持是Math类中的静态方法random(),它生成一个0~1的随机数,类型为double,包括0但不包括1。比如,随机生成并输出3个数:

for(int i=0; i<3; i++){
    System.out.println(Math.random());
}

输出为:
Java Math.random

每次运行,输出都不一样。Math.random()是如何实现的呢?我们来看相关代码(Java 7):

private static Random randomNumberGenerator;
private static synchronized Random initRNG() {
    Random rnd = randomNumberGenerator;
    return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd;
}
public static double random() {
    Random rnd = randomNumberGenerator;
    if (rnd == null) rnd = initRNG();
    return rnd.nextDouble();
}

内部它使用了一个Random类型的静态变量randomNumberGenerator,调用random()就是调用该变量的nextDouble()方法,这个Random变量只有在第一次使用的时候才创建。

下面我们来看这个Random类,它位于包java.util下。

Random

Random类提供了更为丰富的随机方法,它的方法不是静态方法,使用Random,先要创建一个Random实例,看个例子:

Random rnd = new Random();
System.out.println(rnd.nextInt());
System.out.println(rnd.nextInt(100));

输出为:
Java Math.random

nextInt()产生一个随机的int,可能为正数,也可能为负数,nextInt(100)产生一个随机int,范围是0~100,包括0不包括100。除了nextInt,还有一些别的方法:

public long nextLong() //随机生成一个long
public boolean nextBoolean() //随机生成一个boolean
public void nextBytes(byte[] bytes) //产生随机字节, 字节个数就是bytes的长度
public float nextFloat() //随机浮点数,从0到1,包括0不包括1
public double nextDouble() //随机浮点数,从0到1,包括0不包括1

除了默认构造方法,Random类还有一个构造方法,可以接受一个long类型的种子参数:

public Random(long seed)

种子决定了随机产生的序列,种子相同,产生的随机数序列就是相同的。看个例子:

Random rnd = new Random(20160824);
for(int i=0; i<5; i++){
    System.out.print(rnd.nextInt(100)+" ");
}

种子为20160824,产生5个0~100的随机数,输出为:
Java Math.random

这个程序无论执行多少遍,在哪执行,输出结果都是相同的。

除了在构造方法中指定种子,Random类还有一个setter实例方法:

synchronized public void setSeed(long seed)

其效果与在构造方法中指定种子是一样的。

为什么要指定种子呢?指定种子还是真正的随机吗?指定种子是为了实现可重复的随机。比如用于模拟测试程序中,模拟要求随机,但测试要求可重复。

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!