2014-04-09

Random Number Generation

Java產生亂數的方式有兩種,
一種是使用Random物件,另一種是Math.random()函式。

1. java.util.Random

Random物件可以產生許多型態的亂數,
intdoubleboolean...等等。

import java.util.Random;
Random randomGenerator = new Random();
int num1 = randomGenerator.nextInt();
int num2 = randomGenerator.nextInt(n);
int num3 = randomGenerator.nextInt(n)+m;
double num4 = randomGenerator.nextDouble();

nextInt()可以產生任意整數亂數;(line 3)
若給予一個引數n,則會產生0~n-1的亂數;(line 4)
也可以加上offset m,產生m~n+m-1的亂數。(line 5)
舉個例來說,nextInt(3)+5會隨機產生5,6,7三個數的其中一個。
(n就是指定亂數範圍大小)

nextDouble()則可以產生0.0~1.0之間的亂數,(不包含1.0)
待會提到的Math.random()方法會有更詳盡說明。



2. java.lang.Math.random()

Returns a double value with a positive sign, 
greater than or equal to 0.0 and less than 1.0.

由此說明可得知:0.0 ≦ Math.random() < 1.0

這個函式被呼叫時,
Java會自動產生一個Random物件,然後呼叫nextDouble()函式。
此函式的方便之處,就是不需要另外創造一個Random物件。


(1) 產生 [0..10] 的亂數 ( 0 ≦ randomNum ≦ 10 )

將 Math.random() 乘以11,
產生 0.0 ≦ Math.random() < 11.0 的亂數範圍,
之後將型態轉換為int即可。

注意 Math.random() 是不包含右邊界,
因此最大的亂數值為 10.999...,
而int會無條件捨去小數點後的數字,就得到 [0..10] 範圍的亂數了。
import java.lang.Math;
int randomNum = (int)(Math.random()*11);


(2) 產生 [1..10] 的亂數  ( 1 ≦ randomNum ≦ 10 )

將 Math.random() 乘以10之後,再加上1,
產生 1.0 ≦ Math.random() < 11.0 的亂數範圍,
最後將型態轉換為int
int randomNum = (int)(Math.random()*10+1);


(3) 產生 [100..200] 的亂數  ( 100 ≦ randomNum ≦ 200 )

範圍內總共有101個數字,(200-100+1=101)
因此可以將 Math.random() 乘以範圍內亂數個數(101),
產生 0.0 ≦ Math.random() < 101.0 的亂數範圍,
再加上base(100),最後得到 100.0 ≦ Math.random() < 201.0 的亂數範圍。
int randomNum = (int)(Math.random()*(200-100+1)+100);


(4) 通式: 產生 [m..n] 的亂數  ( m ≦ randomNum ≦ n)

Math.random()*(範圍個數)+第一個數字
=> Math.random()*(n-m+1)+m

注意以上例子都是有包含右邊界,
如果不包含右邊界,就不用+1。

沒有留言:

張貼留言