欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

實例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法

 更新時間:2019年02月12日 16:35:44   作者:wlmmmm  
今天小編就為大家分享一篇關(guān)于實例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

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

    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-09
  • spring boot 配置動態(tài)刷新實現(xiàn)詳解

    spring boot 配置動態(tài)刷新實現(xiàn)詳解

    這篇文章主要介紹了spring boot 配置動態(tài)刷新實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Java基礎(chǔ)之反射原理與用法詳解

    Java基礎(chǔ)之反射原理與用法詳解

    這篇文章主要介紹了Java基礎(chǔ)之反射原理與用法,結(jié)合實例形式詳細(xì)分析了java反射的相關(guān)概念、原理、使用方法與操作注意事項,需要的朋友可以參考下
    2020-02-02
  • SpringBoot中使用@scheduled定時執(zhí)行任務(wù)的坑

    SpringBoot中使用@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)系

    這篇文章主要介紹了淺談Spring中幾個PostProcessor的區(qū)別與聯(lián)系,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot2.x實現(xiàn)給Controller的RequestMapping添加統(tǒng)一前綴

    SpringBoot2.x實現(xiàn)給Controller的RequestMapping添加統(tǒng)一前綴

    這篇文章主要介紹了SpringBoot2.x實現(xiàn)給Controller的RequestMapping添加統(tǒng)一前綴,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot返回對象時,如何將Long類型轉(zhuǎn)換為String

    SpringBoot返回對象時,如何將Long類型轉(zhuǎn)換為String

    這篇文章主要介紹了SpringBoot返回對象時,實現(xiàn)將Long類型轉(zhuǎn)換為String,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java中實現(xiàn)String.padLeft和String.padRight的示例

    Java中實現(xiàn)String.padLeft和String.padRight的示例

    本篇文章主要介紹了Java中實現(xiàn)String.padLeft和String.padRight,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java手寫線程池之向JDK線程池進(jìn)發(fā)

    Java手寫線程池之向JDK線程池進(jìn)發(fā)

    在前面的文章自己動手寫乞丐版線程池中,我們寫了一個非常簡單的線程池實現(xiàn),這個只是一個非常簡單的實現(xiàn),在本篇文章當(dāng)中我們將要實現(xiàn)一個和JDK內(nèi)部實現(xiàn)的線程池非常相似的線程池,需要的可以了解一下
    2022-10-10
  • Echarts+SpringMvc顯示后臺實時數(shù)據(jù)

    Echarts+SpringMvc顯示后臺實時數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了Echarts+SpringMvc顯示后臺實時數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評論