Java Math.random,Java中,对随机最基本的支持是Math类中的静态方法random(),它生成一个0~1的随机数,类型为double,包括0但不包括1。比如,随机生成并输出3个数:
for(int i=0; i<3; i++){
System.out.println(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));
输出为:
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的随机数,输出为:
这个程序无论执行多少遍,在哪执行,输出结果都是相同的。
除了在构造方法中指定种子,Random类还有一个setter实例方法:
synchronized public void setSeed(long seed)
其效果与在构造方法中指定种子是一样的。
为什么要指定种子呢?指定种子还是真正的随机吗?指定种子是为了实现可重复的随机。比如用于模拟测试程序中,模拟要求随机,但测试要求可重复。
酷客教程相关文章:
评论前必须登录!
注册