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

1、來源

成都創(chuàng)新互聯(lián)主營嘉祥網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),嘉祥h5成都微信小程序搭建,嘉祥網(wǎng)站營銷推廣歡迎嘉祥等地區(qū)企業(yè)咨詢

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é)果為:

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

如不想生成相同的隨機(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í)價值,謝謝大家對創(chuàng)新互聯(lián)的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

當(dāng)前標(biāo)題:實(shí)例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法
轉(zhuǎn)載來于:http://muchs.cn/article2/ijoeic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站內(nèi)鏈、動態(tài)網(wǎng)站搜索引擎優(yōu)化、網(wǎng)站設(shè)計(jì)公司、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)