天天看點

java随機數生成的方法,Java生成随機數的方法

關鍵技術剖析:(生成随機數有兩個方法:)

1、使用java.util.Math類,它的random方法生成[0,1)區間的随機數,隻産生double型的随機數。

2、使用java.util.Random類,它能生成多種類型随機數,而且随機數範圍不限。

它可以産生int、long、float、double以及Goussian等類型的随機數。

import java.util.Random;

public class RandomNumber {

public static void main(String[] args) {

// 使用java.lang.Math的random方法生成随機數

System.out.println("Math.random(): " + Math.random());

// 使用不帶參數的構造方法構造java.util.Random對象

System.out.println("使用不帶參數的構造方法構造的Random對象:");

Random rd1 = new Random();

// 産生各種類型的随機數

// 按均勻分布産生整數

System.out.println("int: " + rd1.nextInt());

// 按均勻分布産生長整數

System.out.println("long: " + rd1.nextLong());

// 按均勻分布産生大于等于0,小于1的float數[0, 1)

System.out.println("float: " + rd1.nextFloat());

// 按均勻分布産生[0, 1)範圍的double數

System.out.println("double: " + rd1.nextDouble());

// 按正态分布産生随機數

System.out.println("Gaussian: " + rd1.nextGaussian());

// 生成一系列随機數

System.out.print("随機整數序列:");

for (int i = 0; i 

System.out.print(rd1.nextInt() + "  ");

}

System.out.println();

// 指定随機數産生的範圍

System.out.print("[0,10)範圍内随機整數序列: ");

for (int i = 0; i 

// Random的nextInt(int n)方法傳回一個[0, n)範圍内的随機數

System.out.print(rd1.nextInt(10) + "  ");

}

System.out.println();

System.out.print("[5,23)範圍内随機整數序列: ");

for (int i = 0; i 

// 因為nextInt(int n)方法的範圍是從0開始的,

// 是以需要把區間[5,28)轉換成5 + [0, 23)。

System.out.print(5 + rd1.nextInt(23) + "  ");

}

System.out.println();

System.out.print("利用nextFloat()生成[0,99)範圍内的随機整數序列: ");

for (int i = 0; i 

System.out.print((int) (rd1.nextFloat() * 100) + "  ");

}

System.out.println();

System.out.println();

// 使用帶參數的構造方法構造Random對象

// 構造函數的參數是long類型,是生成随機數的種子。

System.out.println("使用帶參數的構造方法構造的Random對象:");

Random ran2 = new Random(10);

// 對于種子相同的Random對象,生成的随機數序列是一樣的。

System.out.println("使用種子為10的Random對象生成[0,10)内随機整數序列: ");

for (int i = 0; i 

System.out.print(ran2.nextInt(10) + "  ");

}

System.out.println();

Random ran3 = new Random(10);

System.out.println("使用另一個種子為10的Random對象生成[0,10)内随機整數序列: ");

for (int i = 0; i 

System.out.print(ran3.nextInt(10) + "  ");

}

System.out.println();

}

}

運作結果:

Math.random(): 0.7990546200078196

使用不帶參數的構造方法構造的Random對象:

int: -1909565938

long: 5254941554125958812

float: 0.79102784

double: 0.7998281314787222

Gaussian: -0.061446637342393966

随機整數序列:1874949902  -1674492890  1608354003  758120942  97994463

[0,10)範圍内随機整數序列: 5  9  8  2  5  1  0  6  4  6

[5,23)範圍内随機整數序列: 19  25  26  10  25  11  13  9  22  13

利用nextFloat()生成[0,99)範圍内的随機整數序列: 38  18  97  25  7  34  78  69  24  70

使用帶參數的構造方法構造的Random對象:

使用種子為10的Random對象生成[0,10)内随機整數序列:

3  0  3  0  6  6  7  8  1  4

使用另一個種子為10的Random對象生成[0,10)内随機整數序列:

3  0  3  0  6  6  7  8  1  4

源碼分析:

1、Random對象根據種子生成随機數,種子相同的Random對象,無論何時運作它,也無論它在那台機器上,生成的随機數序列都是相同的。種子不同的Random對象,生成的随機數序列是不一樣的。

Math類的random方法生成[0,1)

2、使用沒帶參數的Random構造函數生成的随機數序列是目前系統時間的毫秒數。

3、Random對象生成的随機數可能會重複,如果需要生成不重複的随機數序列,需要借助數組或清單。

4、Random對象生成的随機數的範圍都是從零開始的,如果需要擷取其他範圍的随機數,需要對區間進行轉換,比如:區間[a,b)等價于a+[0,b),有時也可以使用乘法。