摘要:介紹了Java中偽隨機(jī)數(shù)生成機(jī)制,并通過“擲骰子”和“35中7福利彩票”兩個(gè)游戲模擬程序,著重闡述了偽隨機(jī)數(shù)在Java軟件設(shè)計(jì)中的應(yīng)用。
關(guān)鍵詞:Java;偽隨機(jī)數(shù);Random類
中圖分類號:TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號:1009-3044(2010)03-628-02
The Research and Application of Pseudo-random Numbers in Java
LI Xiao-ying
(Higher Vocational Technical College, Guilin University of Technology, Nanning 530001, China)
Abstract: This paper introduces the general princle of pseudo-random number generation in java. And the application of Java random number in software design is stressed and described by the two game application program examples of rolliing the dice and welfare lottery.
Key words: java; pseudo-random number; random class
隨機(jī)數(shù)在軟件設(shè)計(jì)領(lǐng)域中得到很廣泛的應(yīng)用。偽隨機(jī)數(shù)是指用數(shù)學(xué)遞推公式所產(chǎn)生的隨機(jī)數(shù),獲取這種數(shù)的最簡單和最自然的方法是利用計(jì)算機(jī)語言的函數(shù)庫提供的隨機(jī)數(shù)發(fā)生器。不同的開發(fā)環(huán)境提供的生成隨機(jī)數(shù)的函數(shù)和方法不一樣。其中應(yīng)用得最為廣泛、研究最徹底的一個(gè)算法即線性同余法。
Java作為一種應(yīng)用廣泛的面向?qū)ο蟮木幊涕_發(fā)語言,對隨機(jī)數(shù)生成提供了多種途徑,以適應(yīng)各種不同的設(shè)計(jì)要求。
1 Java中偽隨機(jī)數(shù)生成機(jī)制
1.1 線性同余法
選取足夠大的正整數(shù)M和任意自然數(shù)n0,a,b,由遞推公式:
ni+1=(af(n)+b)modMi=0,1,…,M-1 (1)
生成的數(shù)值序列稱為是同余序列。當(dāng)函數(shù)f(n)為線性函數(shù)時(shí),即得到線性同余序列:
ni+1=(a*ni+b)modMi=0,1,…,M-1(2)
以下是線性同余法生成偽隨機(jī)數(shù)的偽代碼:
Random(n,m,seed,a,b)
{r0=seed;
for(i=1;i<=n;i++)
ri= (a* ri-1+ b)mod m)
其中種子參數(shù)seed可以任意選擇,常常將它設(shè)為計(jì)算機(jī)當(dāng)前的日期或者時(shí)間;m是一個(gè)較大數(shù),可以把它取為2W,W是計(jì)算機(jī)的字長;a可以是0.01W 和0.99W 之間的任何整數(shù)。
1.2 Java的Random類
Java中提供Random類產(chǎn)生偽隨機(jī)數(shù)。Random類使用48位的種子,使用線性同余公式對其進(jìn)行修改[1-2]。一旦用一個(gè)初值創(chuàng)建Random對象,就可以得到一系列的隨機(jī)數(shù)。
在Random類中,Java設(shè)計(jì)者使用Random()構(gòu)造方法來初始化Random對象。
Random randomGenerator=new Random();
Random()使用當(dāng)前的系統(tǒng)時(shí)間即System.currentTimeMillis()作為發(fā)生器的種子。隨機(jī)數(shù)發(fā)生器即Random對象產(chǎn)生以后,可以通過對象調(diào)用不同的函數(shù):nextInt()、nextLong()、nextFloat()、nextDouble()等來獲得不同類型的隨機(jī)數(shù)。
int randomNumber= randomGenerator.nextInt(n);
其中用到了Random類的nextInt方法。通過nextInt方法產(chǎn)生的隨機(jī)數(shù)的范圍應(yīng)根據(jù)特定應(yīng)用程序需要的不同而不同。當(dāng)給nextInt方法傳遞參數(shù)n時(shí),由nextInt方法所返回的值的范圍為0到n減1。
2 應(yīng)用分析
2.1 擲骰子游戲
1) 問題分析
擲骰子游戲中,游戲者將滾動(dòng)兩個(gè)骰子。每一個(gè)骰子有六個(gè)面,分別代表1,2,3,4,5,6這六個(gè)點(diǎn)。當(dāng)骰子停下以后,得到兩個(gè)隨機(jī)產(chǎn)生的數(shù),計(jì)算這兩個(gè)骰子上面的點(diǎn)數(shù)和,根據(jù)此點(diǎn)數(shù)和判斷玩家是否輸贏。
2) 類定義
根據(jù)問題分析,為該應(yīng)用程序創(chuàng)建骰子類Dice與測試類TestDice,類關(guān)系圖如圖2。
為了能在擲骰子游戲應(yīng)用程序中使用隨機(jī)數(shù),需要導(dǎo)入java.util包的Random類。Dice類定義屬性骰子點(diǎn)數(shù)point,以及滾動(dòng)骰子rollDice和顯示骰子displayDice兩個(gè)方法。其中,rollDice方法用于滾動(dòng)骰子;displayDice用于顯示骰子的圖片。TestDice類定義rule方法,可用于判斷玩家是否輸贏。
3) 類實(shí)現(xiàn)與GUI設(shè)計(jì)
Dice類中rollDice方法關(guān)鍵代碼如下:
public int rollDice()
{point = rand.nextInt(6)+1;
return point;}
該方法生成1~6(包括邊界值)之間的一個(gè)int型隨機(jī)數(shù),作為當(dāng)前骰子點(diǎn)數(shù)。
displayDie方法用于顯示對應(yīng)于1~6之間的骰子圖片,其中第1個(gè)參數(shù)代表所顯示圖片的JLabel,第2個(gè)參數(shù)代表骰子的點(diǎn)數(shù)值。
public void displayDice(JLabel picDiceJLabel,int face)
{image = new ImageIcon
(FILE_PREFIX+face+FILE_SUFFIX);
picDiceJLabel.setIcon(image);}
其中,F(xiàn)ILE_PREFIX和FILE_SUFFIX是兩個(gè)已得到聲明的常量,均定義為private final String型,其值分別為圖片文件夾路徑和圖片后綴。這樣,字符串FILE_PREFIX+face+FILE_SUFFIX可用來指明骰子點(diǎn)數(shù)對應(yīng)的圖片文件位置。
該應(yīng)用程序的GUI運(yùn)行界面如圖3所示。
2.2 35中7福利彩票游戲
1) 問題分析
35中7福利彩票游戲中,中獎(jiǎng)號碼由7個(gè)基本號碼組成,使用指定的專用搖獎(jiǎng)器搖出。搖獎(jiǎng)器內(nèi)放置標(biāo)有01-35的35個(gè)號碼球,搖獎(jiǎng)時(shí)依次搖出7個(gè)號碼球,然后,依據(jù)設(shè)置相應(yīng)的兌獎(jiǎng)規(guī)則,(如7中7、7中6、7中5)等,進(jìn)行兌獎(jiǎng)。
2) 類定義
根據(jù)問題分析,為該應(yīng)用程序創(chuàng)建球類Bull、游戲類Game與測試類TestGame,類關(guān)系圖如圖4。
同樣,為了能在游戲應(yīng)用程序中使用隨機(jī)數(shù),需要導(dǎo)入java.util包的Random類。Bull類定義球號碼point以及顯示球displayBull方法。其中, displayBull用于顯示球號碼對應(yīng)的圖片。Game類中playGame方法用于隨機(jī)從35個(gè)球中“搖出”7個(gè)球,并需要考慮球號不能重復(fù);ruleGame方法用于設(shè)置兌獎(jiǎng)規(guī)則。
3) 類實(shí)現(xiàn)
Game類中playGame方法的關(guān)鍵代碼如下:
public void playGame()
{int i=0;
int index =0;
for(i=0;i {ranarray[i]=i+1; } for(i=0;i {index = rand.nextInt(NumBull); ran[i].setPoint( ranarray[index] ); ranarray[index]=ranarray[--NumBull]; }//產(chǎn)生不重復(fù)的球號} 其中,變量定義如下: int NumBull = 35; //定義總球數(shù) int NumRoll = 7; //定義中獎(jiǎng)球數(shù) Bull[]ran = new Bull[NumRoll]; //定義中獎(jiǎng)的球 private int[] ranarray = new int[NumBull]; //總球的數(shù)組 public Random rand = new Random(); //初始化隨機(jī)數(shù) 3 結(jié)束語 隨機(jī)數(shù)在軟件設(shè)計(jì)領(lǐng)域應(yīng)用十分廣泛,如游戲的設(shè)計(jì),信號的處理,軟件加密等。利用Java良好的面向?qū)ο髾C(jī)制和豐富GUI組件結(jié)合隨機(jī)數(shù)可以設(shè)計(jì)滿足不同應(yīng)用的軟件。 參考文獻(xiàn): [1] Knuth D.The Art of Computer Programming,Volume 2[M].Addison-Wesley,1997. [2] JDKTM 5.0 Documentation[EB/OL].http://www.javatang.com/javadoc/. [3] 梁錦葉.Java語言及應(yīng)用教程[M].北京:人民郵電出版社,2005. [4] 謝仕華.幾種形態(tài)偽隨機(jī)數(shù)生成算法-java實(shí)現(xiàn)[J].中國科技信息,2005(15):28-29. [5] Rumbaugh J,Jacobson I,Booch G.The Unified Modeling language Reference Manual[M].2nd ed.Addison-Weslen,2004. [6] 邵維忠,楊芙清.面向?qū)ο蟮南到y(tǒng)分析[M].2版.北京:清華大學(xué)出版社,2006. [7] 埃克爾.Java編程思想[M].4版.陳昊鵬,譯.北京:機(jī)械工業(yè)出版社,2007. [8] 楊威,吳國風(fēng).幾種偽隨機(jī)數(shù)發(fā)生器機(jī)器在WEB中的應(yīng)用[J].微型電腦應(yīng)用,2007,2(23):57-60.