1. 程式人生 > >Java中Random類的應用問題

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)區間的整數。