用Java實如今【520,1314】之間生成隨機整數的故事

作一個積極的人java

編碼、改bug、提高本身程序員

我有一個樂園,面向編程,春暖花開!編程

在將來城市工做的的程序員小木,作了一個夢,夢到本身在塔魯姆的街道上看到一個姑娘,這個姑娘從遠處走向他,臉上帶着微笑。讓小木非常着迷,小木呆呆的望着姑娘從他身邊走過,當他回過神來,發現姑娘已經走遠,小木趕緊去追這位姑娘,忽然天空中飄下一張字條,上面寫着:安全

我一眼就看出你是Java程序員了,當你能用代碼實現 520~1314 之間的隨機整數,那麼我會主動來找你的!bash

小木還很納悶,爲何這個姑娘知道本身是一個程序員,姑娘難道是上天專門派來的嗎 ?多線程

小木同窗,見下圖:併發

小木很興奮啊,終於我學的Java編程有用武之處了,這個比寫CRUD和看項目留下的爛代碼好不少啊,我寫好了,姑娘就來找我了。小木大腦開始快速運轉,腦神經之間相互發送消息,收集儲存起來的數據。dom

幾秒以後,小木想到了一個方法,在剛開始學習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工程師,感興趣的夥伴能夠私聊!


謝謝你的閱讀,若是您以爲這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你天天開心愉快!



無論作什麼,只要堅持下去就會看到不同!在路上,不卑不亢!

願你我在人生的路上能都變成最好的本身,可以成爲一個獨擋一面的人

© 天天都在變得更好的阿飛雲

相關文章
相關標籤/搜索