在Java中產生隨機數的兩個方法 轉載

Java中產生隨機數的兩個方法

一、利用random方法來生成隨機數。

  在Java語言中生成隨機數相對來說比較簡單,因爲有一個現成的方法可以使用。在Math類中,Java語言提供了一個叫做random的方法。通過這個方法可以讓系統產生隨機數。不過默認情況下,其產生的隨機數範圍比較小,爲大於等於0到小於1double型隨機數。雖然其隨機數產生的範圍比較小,不能夠滿足日常的需求。如日常工作中可能需要產生整數的隨機數。其實,只要對這個方法進行一些靈活的處理,就可以獲取任意範圍的隨機數。

  如我們可以先通過random方法生成一個隨機數,然後將結果乘以10。此時產生的隨機數字即爲大於等於0小於10的數字。然後再利用Int方法進行轉換(它會去掉小數掉後面的數字,即只獲取整數部分,不是四捨五入)。最後即可獲取一個09的整數型隨機數字。其實現方法很簡單,就是對原有的random方法按照如下的格式進行變型:(int)(Math.Random()*10)即可。其實我們還可以對這個方法進行擴展,讓其產生任意範圍內的隨機數。至需要將這個10換成n即可,如改爲(int)(Math.Random()*n)。此時應用程序就會產生一個大於等於0小與n之間的隨機數。如將n設置爲5,那麼其就會產生一個05之間的整數型的隨機數。如果將這個寫成一個帶參數的方法,那麼只要用戶輸入需要生成隨機數的最大值,就可以讓這個方法來生成制定範圍的隨機數。Java中定義自己的工具庫

  有時候程序員可能需要生成一個指定範圍內的隨機偶數或者奇數。此時是否可以通過這個方法來實現呢?答案是肯定的。如現在程序要需要生成一個1-100範圍內的偶數。此時該如何實現?首先,需要生成一個099之內的隨機數(至於這裏爲什麼是99,大家耐心看下去就知道原因了)。要實現這個需求,很簡單吧,只要通過如下語句就可以實現: i=1+(int)(Math.Random()*100)。其中(int)(Math.Random()*100)產生099的整數型隨機數。然後再加上1就是產生1100之間的隨機整數。然後將產生的隨機數賦值給變量i。但是此時其產生的隨機數即有偶數,又有奇數。而現在程序員需要的是一個隨機的偶數。那麼我們可以在後面加上一個if判斷語句。將這個隨機數除以2,如果沒有餘數的話(或者餘數爲0)則表明這個隨機數是偶數,直接返回即可。如果其返回的餘數不爲零,那麼就表明其是奇數,我們只要加上1就變爲了偶數,返回即可。注意,在上面的隨機數生成中,筆者採用的範圍是099,然後再加上1讓其變爲1100的隨機數。最後的結果就是生成1100之間的隨機偶數。其實,如果要範圍隨機奇數的話,至需要對上面的語句進行稍微的修改即可。Java:改變你我的世界

  假設現在用戶想生成一個任意範圍內的奇數或者偶數,能夠實現嗎?假設現在用戶想實現一個mn之間的任意偶數(其中m<N,且爲整數),這該如何處理?其實原理跟上面類似,先利用M+(INT)(MATH.RANDOM()*(N-M))就生成了一個M到之間的隨機整數。然後再利用上面相同的IF語句就可以生成一個MN之間的隨機偶數或者奇數。不果需要注意的是,這裏用戶輸入的MN的值必須爲整數。爲了得到正確的結果,最好在方法內部採用自定義異常的處理機制。當用戶輸入的參數不是整數時,返回錯誤信息,並終止該方法的運行。不過如果想讓這個方法可以接受非整數類型的參數,也是可以的。只是在這個方法開始運行之前,需要先對用戶輸入的參數進行處理。如利用INT方法先對他們進行數據類型轉換,全部轉換爲整數型的數據即可。最後仍然可以得到一個用戶指定範圍內的任意奇數或者偶數。< p>

  可見雖然random方法其自身產生的隨機數有比較嚴格的範圍限制。但是隻要對其進行合理的轉換,程序員仍然可以採用這個方法產生用戶所需要的隨機數據。

  二、通過Random類來生成隨機數。

  在Java語言中,除了可以通過random 方法來產生隨機數之外,還可以通過一個random類來產生隨機數。程序開發人員可以通過實例化一個Random對象來創建一個隨機數的生成器。如Random i=new Random()。通過這條語句就利用了Random類創建了一個隨機數的生成器。不過以這種方法創建隨機數時,與採用Random方法產生隨機數的機制不同。利用現在這種方式實例化對象時,Java編譯器會以系統當前的時間作爲隨機數生成器的種子。由於時間時時刻刻在變化的。若以這個時間作爲生成器的種子,就可以保證生成的隨機數真的是隨機的,其生成的隨機數重複率會大大的降低。

  利用這種方法其比較方便。如可以利用提供的關鍵字,讓程序返回一個隨機的整數(採用int nextInt(10))等等。不過其返回控制要比Random方法困難一點。如現在需要系統提供一個1050之間的隨機奇數, 利用這個Random類就無法完成。也就是說,利用這個Random類來生成隨機數,其只能夠控制上限,而不能夠控制下限。換一句話說,其可以指定最大的隨機數範圍,而不能夠指定最小的隨機數範圍。所以,在靈活性上,其比Random方法要稍微差一點。

  另外利用這個方法來實現的話,必須先創建一個對象。也就是說利用Random類來創建對象。這跟Random方法不同。像上面舉的例子中,Random方法本身就是一個math類中方法,可以直接調用,省去對象創建的方法。爲此筆者建議各位讀者與程序開發人員,最好還是使用Random方法來創建隨機數。只有在生成一些比較特殊的隨機數時採用Random類。如現在需要生成一個概率密度爲高斯分佈的雙精度值隨機數時,則通過採用Random類的方法來創建隨機數相對來說比較簡單一點。

三、產生隨機的字符。

  上面介紹的兩種方法,產生的都是隨機的數值型數據。但是有時候用戶可能還需要產生隨機的字符。其實也可以利用random方法來產生隨機字符。如可以利用代碼生成一個隨機的小寫字符:(char)(‘a’+Math.random()*(‘z’-‘a’+1))。其實這跟生成任意兩個數之間的隨機數類似。通過以上的代碼就可以生成一個範圍之內的任意隨機字符。通過對這個代碼進行適當的修整,還可以生成任意兩個字符之間的隨機字符與任意大寫字符的隨機字符。其轉換的方式跟上面提到的任意範圍之內的隨機數類似。各位讀者若感興趣的話,可以自己進行測試一下。師傅領進門,修行在自身。如果筆者在這裏一股腦兒將所有的答案告訴大家,大家的印象不會很深。大家若回去自己動手試試看,反而更容易記住。

  筆者在這裏給大家一個提示,只需要根據m+(int)(Math.Random()*(n-m))這條語句來調整(char)(‘a’+Math.random()*(‘z’-‘a’+1))這個代碼即可。

  最後筆者需要強調的一點就是在用戶傳入參數的時候,最好要對用戶傳入的參數進行合法性檢查。以免用戶傳入的參數不符合既定的要求,如參數需要的是數值型的數據而傳入的卻是字符型的數據,而導致程序運行出錯。

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