Java Math.random 與 java.util.Random

  • Math.random()
  • java.util.Random

Math.random()

從API來看,他是返回[0,1)之間的double,背後採用uniform分配。此方法第一次被叫用時會產生ㄧ個new pseudorandom-number generator,則new java.util.Random()。

若要產生特定區間的值需要自己加工,範例如下

public static void main(String[] args) {
	
	for(int i=0;i<30;i++) {
		int random = (int) (Math.random()*10);//產生從[0,10)
		System.out.println(random);
	}

    for(int i=0;i<30;i++) {
		int random = (int) (Math.random()*10)+1;//產生從[1,10]
		System.out.println(random);
	}
}

java.util.Random

Random的特點可以設定seed,使得程式每次產生的隨機結果都相同,也有特定API產生所需要的數字區間不用自己加工,背後的分配同樣也是uniform,

與Math.random()相比則需要new的方式產生物件,稍微麻煩。

public static void main(String[] args) {
	Random r1 = new Random();
	Random r2 = new Random(10);//constructor 提供直接將seed設入,也可以用r2.setSeed();
	for(int i =0;i<30;i++) {
		System.out.println(r1.nextInt(10));//產生從[0,10)
		System.out.println(r1.nextBoolean());//產生隨機布林
		System.out.println(r1.nextGaussian());//N(0,1)的常態分配
	}
}

Reference