#java.util.Random简介

来源:互联网 发布:win8.1改mac地址 编辑:程序博客网 时间:2024/05/18 16:40

原文地址: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() // 产生随机longpublic float nextFloat() // 产生随机floatpublic boolean nextBoolean();//产生随机booleanpublic double nextDouble() // 产生随机doublepublic double nextGoussian()// 返回呈高斯/正态分布的 double 值,其平均值是 0.0 标准差是 1.0。//ints、longs、doubles方法 sinces jdk 1.8public 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<Integer> list = new ArrayList<Integer>();        for (int i = 1; i <= 1000; i++) {            list.add(i);        }        for (int j = 0; j < 900; j++) {            getValue(list);        }    }    //生成随机数    public static void getValue(List<Integer> list) {        Random randomGenerator = new Random();        int a = randomGenerator.nextInt(list.size());        int value = list.get(a);        System.out.println(value + "");        // 这个数已经出现过了,那么从list中删除        list.remove(a);    }}
0 0
原创粉丝点击