#java.util.Random简介


原文地址:http://www.yanwushu.com/post/68.html


简介

  • java.util.Random提供了产生各种类型随机数的方法。它可以产生均匀分布的int、long、float、double类型随机值以及Goussian(高斯,正态)分布的double类型随机值。
  • java.lang.Math.Random(),生成[0.0,1.0)之间均匀分布的随机数,内部使用java.util.Random实现。

构造方法

  • Random()//使用默认的种子构造发生器,即:System.currentTimeMillis()
  • Random(long seed)//使用指定的种子构造发生器
    seed(种子)的概念下文中会解释。

方法摘要

java.util.Random所有的公共方法如下列所示,方法功能已经注释。

// 设置seed值
public void setSeed(long seed)

//next系列方法
public void nextBytes(byte[])
public int nextInt() // 产生随机intpublic int nextInt(int)//产生0到参数的随机intpublic long nextLong() // 产生随机long
public float nextFloat() // 产生随机float
public boolean nextBoolean();//产生随机boolean
public double nextDouble() // 产生随机double
public double nextGoussian()// 返回呈高斯/正态分布的 double 值,其平均值是 0.0 标准差是 1.0。

//ints、longs、doubles方法 sinces jdk 1.8
public IntStream ints();
public IntStream ints(long);
public IntStream ints(int ,int);
public IntStream ints(long,int ,int);
public LongStream longs()
public LongStream longs(long)
public LongStream longs(long , long , long)
public LongStream longs(long , long)
public DoubleStraem doubles();
public DoubleStraem doubles(long);
public DoubleStraem doubles(long , double , double);
public DoubleStraem doubles(double ,double);

seed(种子)

计算机产生的随机数都是伪随机数(包括本文中产生的随机数),以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数。
这意味着,如果2个Random对象使用相同的种子(比如都是100),并且以相同的顺序调用相同的函数,那它们返回值完全相同。比如下面代码中两个Random对象的输出完全相同

Random random1 = new Random(100);
System.out.println(random1.nextInt());
System.out.println(random1.nextFloat());
System.out.println(random1.nextBoolean());

Random random2 = new Random(100);
System.out.println(random2.nextInt());
System.out.println(random2.nextFloat());
System.out.println(random2.nextBoolean());

生成[min,max]之间的随机整数

public static void main(String[] args) {
        int max=20;
        int min=10;
        Random random = new Random();
        int s = random.nextInt(max)%(max-min+1) + min;
        System.out.println(s);
}

random.nextInt(max)表示生成[0,max]之间的随机数,然后对(max-min+1)取模。
以生成[10,20]随机数为例,首先生成0-20的随机数,然后对(20-10+1)取模得到[0-10]之间的随机数,然后加上min=10,最后生成的是10-20的随机数

另外

当种子相同时,不同的random实例,同样顺序生成的随机数相同,那么是否会出现下面情况:

java.util.Random() a = new Random();
java.util.Random() b = new Random();

是否有运算速度极快时a和b生成的结果相同的可能性?

一个经典面试题

阿里2015实习生笔试的一道附加题:
用java代码实现:从自然数1到1000中随机取900个不重复的数,并打印出来。
以下为参考答案

package gsm;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Test2 {    
    public static void main(String[] args) {
        List list = new ArrayList();
        for (int i = 1; i <= 1000; i++) {
            list.add(i);
        }
        for (int j = 0; j < 900; j++) {
            getValue(list);
        }
    }
    //生成随机数
    public static void getValue(List list) {
        Random randomGenerator = new Random();
        int a = randomGenerator.nextInt(list.size());

        int value = list.get(a);
        System.out.println(value + "");
        // 这个数已经出现过了,那么从list中删除
        list.remove(a);
    }
}

你可能感兴趣的:(【Java,基础】)