java.util工具类之Random

JDK8在线Api中文手册

JDK8在线Api英文手册

Random 类

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

Random()
Random(long seed)

   使用第1个版本创建的随机数生成器使用相对唯一的种子。第2个版本允许手动指定种子。
   如果使用种子初始化Random对象,就为随机序列定义了开始点。如果使用相同的种子初始化另外一个Random对象,就将会得到相同的随机序列。如果希望生成不同的序列,需要指定不同的种子。实现这种效果的一种方式是使用当前时间作为Random对象的种子。这种方式减少了得到重复序列的可能。
   表1列出了Random类定义的核心公有方法。这些方法在Random中已经存在了很长时间(很多自Java1.0以来就已提供),并且得到了广泛应用。

表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为单位,分类统计落于正负两个标准偏差范围内的值的个数,结果在屏幕的左侧以图形化的方式显示。

//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个方法,返回的流实际上是无穷的。它们有几种重载形式,允许指定流的大小、起点和上界。

发布了59 篇原创文章 · 获赞 20 · 访问量 3635

猜你喜欢

转载自blog.csdn.net/qq_34896730/article/details/104227943
今日推荐