Java隨機數(shù)的5種獲得方法(非常詳細!)
1. Math.random() 靜態(tài)方法
產(chǎn)生的隨機數(shù)是 0 - 1 之間的一個 double
,即 0 <= random < 1
代碼:
結(jié)果:
當調(diào)用 Math.random()
方法時,自動創(chuàng)建了一個偽隨機數(shù)生成器,實際上用的是 new java.util.Random()
。當接下來繼續(xù)調(diào)用 Math.random()
方法時,就會使用這個新的偽隨機數(shù)生成器。
2. java.util.Random 工具類
基本算法:
linear congruential pseudorandom number generator (LGC) 線性同余法偽隨機數(shù)生成器
缺點:可預測
Random類默認使用當前系統(tǒng)時鐘作為種子:
Random類提供的方法:API
- nextBoolean() - 返回均勻分布的 true 或者 false
- nextBytes(byte[] bytes)
- nextDouble() - 返回 0.0 到 1.0 之間的均勻分布的 double
- nextFloat() - 返回 0.0 到 1.0 之間的均勻分布的 float
- nextGaussian()- 返回 0.0 到 1.0 之間的高斯分布(即正態(tài)分布)的 double
- nextInt() - 返回均勻分布的 int
- nextInt(int n) - 返回 0 到 n 之間的均勻分布的 int (包括 0,不包括 n)
- nextLong() - 返回均勻分布的 long
- setSeed(long seed) - 設置種子
只要種子一樣,產(chǎn)生的隨機數(shù)也一樣: 因為種子確定,隨機數(shù)算法也確定,因此輸出是確定的!
3. java.util.concurrent.ThreadLocalRandom 工具類
ThreadLocalRandom
是 JDK 7 之后提供,也是繼承至 java.util.Random。每一個線程有一個獨立的隨機數(shù)生成器,用于并發(fā)產(chǎn)生隨機數(shù),能夠解決多個線程發(fā)生的競爭爭奪。效率更高!
ThreadLocalRandom
不是直接用 new
實例化,而是第一次使用其靜態(tài)方法 current()
得到 ThreadLocal<ThreadLocalRandom>
實例,然后調(diào)用 java.util.Random
類提供的方法獲得各種隨機數(shù)。
4. java.Security.SecureRandom
也是繼承至 java.util.Random。
SecureRandom
提供加密的強隨機數(shù)生成器 (RNG),要求種子必須是不可預知的,產(chǎn)生非確定性輸出。SecureRandom
也提供了與實現(xiàn)無關的算法,因此,調(diào)用方(應用程序代碼)會請求特定的 RNG 算法并將它傳回到該算法的 SecureRandom
對象中。
- 如果僅指定算法名稱,如下所示:
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
- 如果既指定了算法名稱又指定了包提供程序,如下所示:
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
5. 隨機字符串
RandomStringUtils
類的實現(xiàn)上也是依賴了 java.util.Random
工具類:
總結(jié)
到此這篇關于Java隨機數(shù)的5種獲得方法的文章就介紹到這了,更多相關Java生成隨機數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java redis存Map對象類型數(shù)據(jù)的實現(xiàn)
本文主要介紹了Java redis存Map<String,RedisCustom>對象類型數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05Netty分布式高性能工具類FastThreadLocal和Recycler分析
這篇文章主要為大家介紹了Netty分布式高性能工具類FastThreadLocal和Recycler分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03idea之Recompile、Rebuild和Build之間的區(qū)別及說明
這篇文章主要介紹了idea之Recompile、Rebuild和Build之間的區(qū)別及說明,具有很好的參考價值,希望對有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08Spring Boot下如何自定義Repository中的DAO方法
這篇文章主要介紹了Spring Boot下如何自定義Repository中的DAO方法,需要的朋友可以參考下2017-06-06實例詳解Java實現(xiàn)圖片與base64字符串之間的轉(zhuǎn)換
這篇文章主要介紹了Java實現(xiàn)圖片與base64字符串之間的轉(zhuǎn)換實例代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下2016-12-12基于Mybatis-Plus攔截器實現(xiàn)MySQL數(shù)據(jù)加解密的示例代碼
用戶的一些敏感數(shù)據(jù),例如手機號、郵箱、身份證等信息,在數(shù)據(jù)庫以明文存儲時會存在數(shù)據(jù)泄露的風險,因此需要進行加密,解密等功能,接下來本文就給大家介紹基于Mybatis-Plus攔截器實現(xiàn)MySQL數(shù)據(jù)加解密,需要的朋友可以參考下2023-07-07