實例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法
1、來源
random.nextInt() 為 java.util.Random類中的方法;
Math.random() 為 java.lang.Math 類中的靜態(tài)方法。
2、用法
產(chǎn)生0-n的偽隨機(jī)數(shù)(偽隨機(jī)數(shù)參看最后注解):
// 兩種生成對象方式:帶種子和不帶種子(兩種方式的區(qū)別見注解) Random random = new Random(); Integer res = random.nextInt(n);
Integer res = (int)(Math.random() * n);
3、jdk源碼
// random.nextInt(n) public int nextInt(int n) { if (n <= 0) throw new IllegalArgumentException("n must be positive"); if ((n & -n) == n) // i.e., n is a power of 2 return (int)((n * (long)next(31)) >> 31); int bits, val; do { bits = next(31); val = bits % n; } while (bits - val + (n-1) < 0); return val; }
// Math.random() public static double random() { Random rnd = randomNumberGenerator; // 第一次調(diào)用,生成一個隨機(jī)數(shù)生成器 if (rnd == null) rnd = initRNG(); return rnd.nextDouble(); } // 生成的方法為同步的,線程安全 private static synchronized Random initRNG() { Random rnd = randomNumberGenerator; return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd; } // 該方法為 Random 類中的方法 public double nextDouble() { return (((long)(next(26)) << 27) + next(27)) / (double)(1L << 53); }
4、小結(jié)
- Math.random() 方法生成[0, 1)范圍內(nèi)的double類型隨機(jī)數(shù);Random類中的nextXxxx系列方法生成0-n的隨機(jī)數(shù);
- Math.random() 線程安全,多線程環(huán)境能被調(diào)用;
- 如無特殊需求,則使用(int)(Math.random()*n)的方式生成隨機(jī)數(shù)即可。
5、注:何謂偽隨機(jī)數(shù)
偽隨機(jī)既有規(guī)則的隨機(jī),Random類中的隨機(jī)算法就是偽隨機(jī)。
具體表現(xiàn)為:相同種子數(shù)的Random對象生成的隨機(jī)數(shù)序列相同:
@Test public void createProjectNo() { Random r1 = new Random(100); Random r2 = new Random(100); for (int i = 0; i < 100; i ++) { System.out.println(r1.nextInt(10)+", "+r2.nextInt(10)); } }
結(jié)果為:
如不想生成相同的隨機(jī)數(shù)序列,則應(yīng)只使用一個Random類。而Math類中的隨機(jī)數(shù)生成器 randomNumberGenerator 對象為靜態(tài)的,可考慮使用。
6、注:Random類的兩種構(gòu)造方法區(qū)別
1、源碼
public Random() { this(seedUniquifier() ^ System.nanoTime()); } public Random(long seed) { if (getClass() == Random.class) this.seed = new AtomicLong(initialScramble(seed)); else { // subclass might have overriden setSeed this.seed = new AtomicLong(); setSeed(seed); } }
2、區(qū)別
從源碼中可以看到,未定義種子的構(gòu)造方法里,使用當(dāng)前系統(tǒng)時間相關(guān)的一個數(shù)字作為種子數(shù),該種子數(shù)只作為隨機(jī)算法的起源數(shù)字,與生成的隨機(jī)數(shù)區(qū)間無關(guān)系。
這篇文章是我對Java中隨機(jī)數(shù)的一些簡單的理解,如有不對的地方或者其他的見解歡迎指導(dǎo)。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql
這篇文章主要給大家介紹了關(guān)于JDBC中如何使用Java8的日期LocalDate和LocalDateTime的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09spring boot 配置動態(tài)刷新實現(xiàn)詳解
這篇文章主要介紹了spring boot 配置動態(tài)刷新實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09SpringBoot中使用@scheduled定時執(zhí)行任務(wù)的坑
本文主要介紹了SpringBoot中使用@scheduled定時執(zhí)行任務(wù)的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05淺談Spring中幾個PostProcessor的區(qū)別與聯(lián)系
這篇文章主要介紹了淺談Spring中幾個PostProcessor的區(qū)別與聯(lián)系,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08SpringBoot2.x實現(xiàn)給Controller的RequestMapping添加統(tǒng)一前綴
這篇文章主要介紹了SpringBoot2.x實現(xiàn)給Controller的RequestMapping添加統(tǒng)一前綴,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02SpringBoot返回對象時,如何將Long類型轉(zhuǎn)換為String
這篇文章主要介紹了SpringBoot返回對象時,實現(xiàn)將Long類型轉(zhuǎn)換為String,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06Java中實現(xiàn)String.padLeft和String.padRight的示例
本篇文章主要介紹了Java中實現(xiàn)String.padLeft和String.padRight,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Echarts+SpringMvc顯示后臺實時數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Echarts+SpringMvc顯示后臺實時數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12