關鍵技術剖析:(生成随機數有兩個方法:)
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),有時也可以使用乘法。