用Java實現在【520,1314】之間生成隨機整數的故事
做一個積極的人
編碼、改bug、提升自己
我有一個樂園,面向編程,春暖花開!
在未來城市工作的的程序員小木,做了一個夢,夢到自己在塔魯姆的街道上看到一個姑娘,這個姑娘從遠處走向他,臉上帶著微笑。讓小木很是著迷,小木呆呆的望著姑娘從他身邊走過,當他回過神來,發現姑娘已經走遠,小木趕忙去追這位姑娘,突然天空中飄下一張字條,上面寫著:
我一眼就看出你是Java程序員了,當你能用代碼實現 520~1314 之間的隨機整數,那麽我會主動來找你的!
小木還很納悶,為什麽這個姑娘知道自己是一個程序員,姑娘難道是上天專門派來的嗎 ?
小木同學,見下圖:
小木很興奮啊,終於我學的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);
小木在上面代碼下面備註了如下內容:
1、Random類采用AtomicLong實現,保證多線程的線程安全性,但是多線程並發獲取隨機數時性能較差。
2、ThreadLocalRandom就實現了,ThreadLocalRandom繼承了Random。多線程環境中可以使用ThreadLocalRandom作為隨機數生成器,ThreadLocalRandom采用了線程局部變量來改善性能。
最後當小木寫完代碼後,聽到早晨的鬧鐘響了,美夢就這樣被鬧鐘無情的敲碎了,醒來後,小木久久不能忘記夢中的姑娘,想著什麽時候能夠再次偶遇!
你期待小木和夢中姑娘的的再次相遇嘛,我真的還期待,說不定一段美妙的愛情火花就會擦出。
最後幫歡哥打波廣告: 阿裏口碑,杭州,Java工程師,感興趣的夥伴可以私聊!
用Java實現在【520,1314】之間生成隨機整數的故事