用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工程師,感興趣的伙伴可以私聊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM