#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<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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章