1. 程式人生 > >用Java實現在【520,1314】之間生成隨機整數的故事

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

clas bsp int 為什麽 atomic next str 我會 strong

做一個積極的人

編碼、改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】之間生成隨機整數的故事