Random 类
Random类是伪随机数生成器。之所以称为伪随机数(pseudorandom),是因为它们只是简单的均匀分布序列。Random类定义了以下构造函数:
Random()
Random(long seed)
使用第1个版本创建的随机数生成器使用相对唯一的种子。第2个版本允许手动指定种子。
如果使用种子初始化Random对象,就为随机序列定义了开始点。如果使用相同的种子初始化另外一个Random对象,就将会得到相同的随机序列。如果希望生成不同的序列,需要指定不同的种子。实现这种效果的一种方式是使用当前时间作为Random对象的种子。这种方式减少了得到重复序列的可能。
表1列出了Random类定义的核心公有方法。这些方法在Random中已经存在了很长时间(很多自Java1.0以来就已提供),并且得到了广泛应用。
方 法 | 描 述 |
---|---|
boolean nextBoolean() | 返回下一个布尔型随机数 |
void nextBytes(byte vals[]) | 使用随机产生的值填充vals |
double nextDouble() | 返回下一个double型随机数 |
float nextFloat() | 返回下一个float型随机数 |
double nextGaussian | 返回下一个高斯分布随机数 |
int nextInt() | 返回下一个int型随机数 |
int nextInt(int n) | 返回介于0和n之间的下一个int型随机数 |
long nextLong() | 返回下一个long型随机数 |
void setSeed(long newSeed) | 将种子(即随机数字生成器的开始点)设置为newSeed指定的值 |
可以看出,能够从Random对象抽取各种类型的随机数;通过调用nextBoolean()方法可以得到随机布尔值;通过调用nextBytes()方法可以获取随机字节;通过调用nextInt()方法可以抽取随机整数;通过调用nextLong()方法可以获取在整个取值范围均匀分布的长整型随机数。nextFloat()和nextDouble()方法分别返回在0.0到1.0之间均匀分布的float和double型随机数。最后,nextGaussian()方法返回均值为0.0,方差为1.0的标准高斯分布伪随机数,其类型为double,这就是注明的钟形曲线(bell curve)。
下面是一个例子,演示了由nextGaussian()方法产生的随机序列。该例首先获取100个随机高斯值并计算它们的平均值。该程序还以0.5为单位,分类统计落于正负两个标准偏差范围内的值的个数,结果在屏幕的左侧以图形化的方式显示。
//Demonstrate random Gaussian values.
import java.util.Random;
class RandDemo {
public static void main(String[] args) {
Random r = new Random();
double val;
double sum = 0;
int bell[] = new int[10];
for (int i=0;i<100;i++){
val = r.nextGaussian();
sum+=val;
double t=-2;
for (int x=0;x<10;x++,t+=0.5){
if(val<t){
bell[x]++;
break;
}
}
}
System.out.println("Average of values: "+(sum/100));
//display bell curve,sideways
for (int i=0;i<10;i++){
for(int x=bell[i];x>0;x--){
System.out.print("*");
}
System.out.println();
}
/**
* 输出:可以看出,得到了类似钟形分布的数字
* ****
* ******
* *******
* ****************
* *******************
* ******************
* *************
* **********
* ***
* ****
*/
}
}
JDK8向Random类添加了3个支持新的流API的方法:doubles()、ints()和longs()。它们都返回一个流,其中包含了指定类型的随机数的一个序列。每个方法都定义了几种重载形式。下面列出了3个方法的最简单形式:
DoubleStream doubles()
IntStream ints()
LongStream longs()
doubles()方法返回的流包含了double类型的随机数(值的范围在0.0~1.0之间)。ints()方法返回的流包含了int类型的随机值。long()方法返回的流包含了long类型的随机值。对于这3个方法,返回的流实际上是无穷的。它们有几种重载形式,允许指定流的大小、起点和上界。