隨機數

在實際開發中生成隨機數的使用是很普遍的,所以在程序中生成隨機數的操作很重要。在Java中主要提供了兩種方式生成隨機數,分別爲調用Math類的random()方法和Random類提供的生成各種數據類型隨機數的方法,下面分別進行講解。

9.3.1 Math.random()方法

在Math類中存在一個random()方法,用於生成隨機數字,該方法默認生成大於等於0.0小於1.0的double型隨機數,即0<=Math.random()<1.0,雖然Math.random()方法只可以生成0~1之間的double型數字,但只要在Math.random()語句上稍加處理,就可以使用這個方法生成任意範圍的隨機數,如圖9.11所示。  


圖9.11 使用random()方法示意圖

爲了更好地解釋這種生成隨機數的方式,下面舉例說明。

【例9.10】使用Math.random()方法實現一個簡單的猜數字小遊戲,要求:使用Math.random()方法生成一個0——100之間的隨機數字,然後用戶輸入猜測的數字,判斷輸入的數字是否與隨機生成的數字匹配,如果不匹配,提示相應的信息,如果匹配,則表示猜中,遊戲結束。代碼如下:

 

public class NumGame {

       publicstatic void main(String[] args) {

              System.out.println("——————猜數字遊戲——————\n");

              intiNum;

              intiGuess;

              Scannerin = new Scanner(System.in);         // 創建掃描器對象,用於輸入

              iNum= (int) (Math.random() * 100);              //生成0到100之間的隨機數

              System.out.print("請輸入你猜的數字:");

              iGuess= in.nextInt();                                 //輸入首次猜測的數字

              while((iGuess != -1) && (iGuess != iNum)) //判斷輸入的數字不是-1或者基準數

              {

                     if(iGuess < iNum)  // 若猜測的數字小於基準數,則提示用戶輸入的數太小,並讓用戶重新輸入

                     {

                            System.out.print("太小,請重新輸入:");

                            iGuess= in.nextInt();

                     }else                    // 若猜測的數字大於基準數,則提示用戶輸入的數太大,並讓用戶重新輸入

                     {

                            System.out.print("太大,請重新輸入:");

                            iGuess= in.nextInt();

                     }

              }

              if(iGuess == -1)           // 若最後一次輸入的數字是-1,循環結束的原因是用戶選擇退出遊戲

              {

                     System.out.println("退出遊戲!");

              }else                           // 若最後一次輸入的數字不是-1,用戶猜對數字,獲得成功,遊戲結束

              {

                     System.out.println("恭喜你,你贏了,猜中的數字是:" + iNum);

              }

              System.out.println("\n———————遊戲結束———————");

       }

}

 

在Eclipse中運行本實例,結果如圖9.12所示。

圖9.12猜數字遊戲

除了隨機生成數字以外,使用Math類的random()方法還可以隨機生成字符,例如,可以使用下面代碼生成a~z之間的字符:

(char)('a'+Math.random()*('z'-'a'+1));

通過上述表達式可以求出更多的隨機字符,如A~Z之間的隨機字符,進而推理出求任意兩個字符之間的隨機字符,可以使用以下語句表示:

(char)(cha1+Math.random()*(cha2-cha1+1));

在這裏可以將這個表達式設計爲一個方法,參數設置爲隨機生成字符的上限與下限。下面舉例說明。

【例9.11】在項目中創建MathRandomChar類,在類中編寫GetRandomChar()方法生成隨機字符,並在主方法中輸出該字符。 


 

在Eclipse中運行本實例,運行結果如圖9.13所示。

   

圖9.13獲取任意區間的隨機字符

publicclass MathRandomChar {

       //定義獲取任意字符之間的隨機字符

       publicstaticchar GetRandomChar(charcha1, char cha2) {

              return (char) (cha1+ Math.random() * (cha2 - cha1 + 1));

       }

       publicstaticvoid main(String[]args) {

              //獲取a~z之間的隨機字符

              System.out.println("任意小寫字符" + GetRandomChar('a','z'));

              //獲取A~Z之間的隨機字符

              System.out.println("任意大寫字符" + GetRandomChar('A','Z'));

              //獲取0~9之間的隨機字符

              System.out.println("0到9任意數字字符" + GetRandomChar('0', '9'));

       }

}

Random類

除了Math類中的random()方法可以獲取隨機數之外,Java中還提供了一種可以獲取隨機數的方式,那就是java.util.Random類,該類表示一個隨機數生成器,可以通過實例化一個Random對象創建一個隨機數生成器。語法如下:

Randomr=new Random();

其中,r是指Random對象。

以這種方式實例化對象時,Java編譯器以系統當前時間作爲隨機數生成器的種子,因爲每時每刻的時間不可能相同,所以生成的隨機數將不同,但是如果運行速度太快,也會生成兩次運行結果相同的隨機數。

同時也可以在實例化Random類對象時,設置隨機數生成器的種子。

語法如下:

Randomr=new Random(seedValue);

þ  r:Random類對象。

þ  seedValue:隨機數生成器的種子。

在Random類中提供了獲取各種數據類型隨機數的方法,其常用方法及說明如表9.11所示。

表9.11  Random類中常用的獲取隨機數方法

方法

返回值

功能描述

nextInt()

int

返回一個隨機整數

nextInt(int n)

int

返回大於等於0小於n的隨機整數

nextLong()

long

返回一個隨機長整型值

nextBoolean()

boolean

返回一個隨機布爾型值

nextFloat()

float

返回一個隨機浮點型值

nextDouble()

double

返回一個隨機雙精度型值

nextGaussian()

double

返回一個概率密度爲高斯分佈的雙精度值

 【例9.12】使用Random類模擬微信的搶紅包功能,具體實現時,在項目中創建RedBags類,然後根據用戶輸入的紅包額度和個數隨機生成每個紅包的金額。代碼如下:

 

importjava.util.Random;

importjava.util.Scanner;

publicclassRedBags { // 創建一個RedBags類

       publicstaticvoidmain(String[] args) {

              System.out.println("—————————模擬微信搶紅包—————————\n");

              Scanner sc= new Scanner(System.in); // 控制檯輸入

              System.out.print("請輸入要裝入紅包的總金額(元):");

 

              doubletotal = sc.nextDouble();// 輸入“紅包的總金額”

              System.out.print("請輸入紅包的個數(個):");

              intbagsnum = sc.nextInt();// 輸入“紅包的個數”

              doublemin = 0.01; // 初始化“紅包的最小金額”

 

              Random random= new Random(); // 創建隨機數對象random

              for(inti= 1; i<bagsnum;i++) { // 設置“循環”

                     /*

                      * 通過公式模擬數學中的離散模型計算一個紅包可以放的最大金額

                      * 本次紅包可用最大金額 = 可分配金額 - (紅包總數 * 已發出的紅包數) * 紅包的最小金額

                      */

                     doublemax = total - (bagsnum - i) * min;

 

                     doublebound = max - min;// 設置隨機金額的取值範圍

                     /*

                      * 據隨機金額的取值範圍,隨機生成紅包金額。

                      * 由於nextInt(int bound)只能用整型做參數,所以先將bound乘100(小數點向右挪兩位)

                      * 獲取到一個整數後,將這個整數除100(小數點向左挪兩位)並轉換成與金額相同的浮點類型

                      */

                     doublesafe = (double)random.nextInt((int)(bound * 100)) / 100;

                     doublemoney = safe + min;// 最後加上紅包的最小金額,以防safe出現0值

 

                     total= total - money;// 替換total的值

 

                     System.out.println("第" + i+ "個紅包:" + String.format("%.2f", money)+ "元");

              }

              System.out.println("第" + bagsnum+ "個紅包:" + String.format("%.2f", total)+ "元");

              sc.close();// 關閉控制檯輸入

       }

}

在Eclipse中運行本實例,運行結果如圖9.14所示。


圖9.14  模擬微信搶紅包功能

感謝讀者朋友對明日科技的支持,如果您對圖書中的講解及光盤源碼有任何問題,可以直接登錄http://www.mingrisoft.com上的社區進行發貼,把您的問題詳細的說明一下,我們的技術人員會在那裏給您回覆!

本文摘自明日科技出版的《Java從入門到精通(項目案例版)》,轉載請註明出處!!!

發佈了109 篇原創文章 · 獲贊 40 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章