java.util工具类之Random

JDK8在线Api中文手册java

JDK8在线Api英文手册web

Random 类

   Random类是伪随机数生成器。之因此称为伪随机数(pseudorandom),是由于它们只是简单的均匀分布序列。Random类定义了如下构造函数:api

Random()
Random(long seed)

   使用第1个版本建立的随机数生成器使用相对惟一的种子。第2个版本容许手动指定种子。
   若是使用种子初始化Random对象,就为随机序列定义了开始点。若是使用相同的种子初始化另一个Random对象,就将会获得相同的随机序列。若是但愿生成不一样的序列,须要指定不一样的种子。实现这种效果的一种方式是使用当前时间做为Random对象的种子。这种方式减小了获得重复序列的可能。
   表1列出了Random类定义的核心公有方法。这些方法在Random中已经存在了很长时间(不少自Java1.0以来就已提供),而且获得了普遍应用。oracle

表1 Random类定义的核心公有方法
方 法 描 述
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为单位,分类统计落于正负两个标准误差范围内的值的个数,结果在屏幕的左侧以图形化的方式显示。dom

//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个方法的最简单形式:ide

DoubleStream doubles()
IntStream ints()
LongStream longs()

   doubles()方法返回的流包含了double类型的随机数(值的范围在0.0~1.0之间)。ints()方法返回的流包含了int类型的随机值。long()方法返回的流包含了long类型的随机值。对于这3个方法,返回的流其实是无穷的。它们有几种重载形式,容许指定流的大小、起点和上界。svg