作一個積極的人java
編碼、改bug、提高本身程序員
我有一個樂園,面向編程,春暖花開!編程
在將來城市工做的的程序員小木,作了一個夢,夢到本身在塔魯姆的街道上看到一個姑娘,這個姑娘從遠處走向他,臉上帶着微笑。讓小木非常着迷,小木呆呆的望着姑娘從他身邊走過,當他回過神來,發現姑娘已經走遠,小木趕緊去追這位姑娘,忽然天空中飄下一張字條,上面寫着:安全
我一眼就看出你是Java程序員了,當你能用代碼實現 520~1314 之間的隨機整數,那麼我會主動來找你的!多線程
小木還很納悶,爲何這個姑娘知道本身是一個程序員,姑娘難道是上天專門派來的嗎 ?併發
小木同窗,見下圖:dom
小木很興奮啊,終於我學的Java編程有用武之處了,這個比寫CRUD和看項目留下的爛代碼好不少啊,我寫好了,姑娘就來找我了。小木大腦開始快速運轉,腦神經之間相互發送消息,收集儲存起來的數據。性能
幾秒以後,小木想到了一個方法,在剛開始學習Java的時候學過一個 Math
類,它裏面有一個生成隨機數的方法random()
。可是經過Math.random()
獲取的隨機數是[0,1)之間的double值。注:包含0,但1不包含!學習
那要獲取整數,則須要將上面的結果轉行成int類型便可。獲取[0, 1)之間的int整數。方法以下:編碼
double d = Math.random(); // [0, 1) int love = (int) (d);
// randNumber 將被賦值爲一個 MIN 和 MAX 範圍內的隨機數 int randNumber = rand.nextInt(MAX - MIN + 1) + MIN;
簡單思考:要讓值落在520~1314,那麼
MAX : 1314
MIN: 520
由於 Math.random()
獲取[0, 1),換算公式: (Math.random() * (MAX - MIN)) + MIN
根據公式照葫蘆畫瓢,小木很快就實現隨機 520~1314 的代碼了!
double d = Math.random(); // [520, 1314) int love = (int) (d * (1314-520)) + 520;
寫完上面的代碼後,小木想仍是要檢查檢查,不能馬虎大意,畢竟這關乎姑娘會不會來找本身。代碼運行N多遍以後,520是包含了,可是1314 怎麼也出現不了!小木很快意識到這問題很嚴重。沒有1314 姑娘找他這件事確定就泡湯了。從新看上面的換算公式, 小木發現公式有點問題,少了個 1 啊!
正確的公式是 : (Math.random() * (MAX - MIN + 1)) + MIN
double d = Math.random(); // [520, 1315) int love = (int) (d * (1314 - 520 + 1) + 520;
這樣就完美一點了,隨機數就能夠包含1314,這樣就能夠[520,1314]了。
注: 爲了方便閱讀,括號內就沒有直接寫出運算後的值。
大腦還處在高速運轉的小木,實現了上面的功能後,心想這麼容易就能約到姑娘了,這是否是有點太簡單了。因而又想還有沒有其餘辦法還能實現此功能呢?又想到了有Math.random()
。不是還有一個Random類
嘛,和Random類
一塊兒的還有一個ThreadLocalRandom類
。無論咋,我在用一種方法實現如下,好好表現一下本身也好!
使用Random獲取[520, 1314]之間的int整數,Random 對象的nextInt(int)
方法,將生成 [0, int)之間隨機取值的整數。根據上面的思路,實現代碼以下:
Random random = new Random(); // [520,1315) == [520,1314] int love = (random.nextInt(1314 - 520 + 1) + 520);
小木在上面代碼下面備註了以下內容:
一、Random類採用AtomicLong實現,保證多線程的線程安全性,可是多線程併發獲取隨機數時性能較差。
二、ThreadLocalRandom就實現了,ThreadLocalRandom繼承了Random。多線程環境中可使用ThreadLocalRandom做爲隨機數生成器,ThreadLocalRandom採用了線程局部變量來改善性能。
最後當小木寫完代碼後,聽到早晨的鬧鐘響了,好夢就這樣被鬧鐘無情的敲碎了,醒來後,小木久久不能忘記夢中的姑娘,想着何時可以再次偶遇!
你期待小木和夢中姑娘的的再次相遇嘛,我真的還期待,說不定一段美妙的愛情火花就會擦出。
最後幫歡哥打波廣告: 阿里口碑,杭州,Java工程師,感興趣的夥伴能夠私聊!