在實際開發中生成隨機數的使用是很普遍的,所以在程序中生成隨機數的操作很重要。在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從入門到精通(項目案例版)》,轉載請註明出處!!!