問題的引出
缺點1:如果n是一個比較小的2的乘方,經過一段相當短的周期之后,它產生的隨機數序列將會重復。
缺點2:如果n不是2的乘方,那么平均起來,有些數比其他的數出現得更為頻繁。如果n比較大,這個缺點就會非常明顯。
運行之后打印出來的數接近于666 666。由random
方法產生的數字有2/3落在隨機數取值范圍的前半部分。
缺點3,在極少數情況下,它的失敗是災難性的,返回一個落在指定范圍之外的數。
這個方式試圖通過Math.abs
,將rnd.nextInt()
返回的值映射為一個非負整數int
。如果nextInt()
返回Integer.MAX_VALUE
,那么Math.abs
也會返回Integer.MAX_VALUE
,假設n
不是2的乘方,那么取模操作(%
)將返回一個負數。這肯定會使程序失敗,而且這種失敗很難重現。
解決辦法
直接使用Random.nextInt(int)
方法。
使用庫的好處
通過使用標準庫,可以充分利用這些編寫標準庫的專家的知識,以及在你之前的其他人的使用經驗。
不必浪費時間為那些與工作不大相關的問題提供特別的解決方案。應該把時間花在應用程序上,而不是底層的細節上。
標準庫的性能會隨著時間的推移而不斷提高,無需你做任何努力。
標準庫被當做工業標準來使用,提供這些標準庫的組織有強烈的動機要使它們運行得更快。
標準庫會隨著時間的推移而增加新的功能。
使用標準庫,使自己的代碼融入主流,這樣的代碼更易讀、更易維護、更易被大多數的開發人員重用。
保持與新版本的同步
在每個重要的發行版本中,都會有許多新的特性被加入到類庫中,與這些新特性保持同步是值得的。
Collections Framework
統一的體系結構,用來表示和操作集合,允許它們對集合進行獨立于實現細節的操作。
減輕了編程的負擔,同時還提升了性能。
它考慮到了不相關的API之間的互操作性,減少了為設計和學習新的API所要付出的努力,并且鼓勵軟件重用。
java.util.concurrent
并發實用工具。
包含高級的并發工具來簡化多線程的編程任務,還包含級別低的并發基本類型,允許專家們自己編寫更高級的并發抽象。
總結
不要重復發明輪子。
類庫代碼的投入遠遠超過任何程序員在同樣的功能上所能夠給予的投入。