Java中Random類的應用問題
在實際中呼叫Random(java.util)類的預算時,需要弄清楚Random中每個方法的呼叫方式是否可以使用。
int nextInt() :返回下一個偽隨機數,它是此隨機數生成器的序列中均勻分佈的 int 值。
備註:生成一個隨機的int值,該值介於[0,n)的區間,也就是0到n之間的隨機int值,包含0而不包含n。
int nextInt(int n) :返回一個偽隨機數,它是取自此隨機數生成器序列的、在 0(包括)和指定值(不包括)之間均勻分佈的 int 值。
nextBoolean() :返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分佈的 boolean 值。
nextBytes(byte[] bytes) :生成隨機位元組並將其置於使用者提供的 byte 陣列中。
nextDouble() :返回下一個偽隨機數,它是取自此隨機數生成器序列的、在 0.0 和 1.0 之間均勻分佈的 double 值。
public void setSeed(long seed):重新設定Random物件中的種子數。設定完種子數以後的Random物件和相同種子數使用new關鍵字創建出的Random物件相同。
對此相信大家對一個數很敏感,偽隨機數這是一個在Java中怎麼樣的數值應用呢?
在計算機學中,存在這樣的三類數值:真隨機數,準隨機數,偽隨機數。在此我們簡單的介紹一下什麼是偽隨機數:通過某種數學公式或者演算法產生的數值序列。雖然在數學意義上偽隨機數是不隨機的,但是如果能通過統計檢測,可以當成真隨機數使用。
在實際中的應用上,將根據所需要的題目型別及條件進行判斷。下面我將通過一個例子對nextInt進行的用法進行簡單的介紹:
import java.util.Random;
public class RandomTest {
public static void main(String[] args) {
int max = 50;
int min = 1;
Random random = new Random();
int s = random.nextInt(max) + min;
System.out.println(s);
}
}
通過上面的例子可以得到一個[0,N)的開區間的範圍,在此範圍內就不能滿足實際中的隨機數的產生,需要在原本計算的範圍增加一作為產生隨機數的基本條件。
通過查閱Java中API8版本的手冊可以發現在呼叫nextInt()的時候進行以下的運算。
public int nextInt(int n) {
if (n <= 0)
throw new IllegalArgumentException(“n must be positive”);
if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)next(31)) >> 31);
int bits, val;
do {
bits = next(31);
val = bits % n;
} while (bits - val + (n-1) < 0);
return val;
}
下面開始就通過實際的例子清晰理解整個Random中常用的方法:
Random R = new Random();
1、生成[0,5.0)區間的小數
double R2 = R.nextDouble() * 5;
生成[0,R)區間的隨機小數,R為任意正的小數,則只需要將nextDouble方法的返回值乘以R即可
2、生產隨機數;
Random R = new Random();
int n1 = R.nextInt();
這次,直接採用nextInt()方法即可。直接產生隨機數
3、生成任意[0,n)區間的隨機整數;
int n2 = R.nextInt(n);
n2 = Math.abs(R.nextInt() % n);強調內容
3、生成[0,10]區間的整數
Random R = new Random();
int n3 = r.nextInt(11);
n3 = Math.abs(r.nextInt() % 11);
[0,10]區間和[0,11)區間等價,所以即生成[0,11)區間的整數。