實例講解Java中random.nextInt()與Math.random()的基礎用法
1、來源
random.nextInt() 為 java.util.Random類中的方法;
Math.random() 為 java.lang.Math 類中的靜態(tài)方法。
2、用法
產(chǎn)生0-n的偽隨機數(shù)(偽隨機數(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)用,生成一個隨機數(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類型隨機數(shù);Random類中的nextXxxx系列方法生成0-n的隨機數(shù);
- Math.random() 線程安全,多線程環(huán)境能被調(diào)用;
- 如無特殊需求,則使用(int)(Math.random()*n)的方式生成隨機數(shù)即可。
5、注:何謂偽隨機數(shù)
偽隨機既有規(guī)則的隨機,Random類中的隨機算法就是偽隨機。
具體表現(xiàn)為:相同種子數(shù)的Random對象生成的隨機數(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ù)序列,則應只使用一個Random類。而Math類中的隨機數(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)造方法里,使用當前系統(tǒng)時間相關的一個數(shù)字作為種子數(shù),該種子數(shù)只作為隨機算法的起源數(shù)字,與生成的隨機數(shù)區(qū)間無關系。
這篇文章是我對Java中隨機數(shù)的一些簡單的理解,如有不對的地方或者其他的見解歡迎指導。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接
相關文章
Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 實現(xiàn)分庫分表功能
這篇文章主要介紹了Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 實現(xiàn)分庫分表功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
詳解Java如何在Array和List之間進行轉(zhuǎn)換
這篇文章主要為大家介紹了詳解Java如何在Array和List之間進行轉(zhuǎn)換的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
Java NIO.2 使用Path接口來監(jiān)聽文件、文件夾變化
Java7對NIO進行了大的改進,新增了許多功能,接下來通過本文給大家介紹Java NIO.2 使用Path接口來監(jiān)聽文件、文件夾變化 ,需要的朋友可以參考下2019-05-05
簡單了解java volatile關鍵字實現(xiàn)的原理
這篇文章主要介紹了簡單了解volatile關鍵字實現(xiàn)的原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08
Java大數(shù)運算BigInteger與進制轉(zhuǎn)換詳解
這篇文章主要介紹了Java大數(shù)運算BigInteger與進制轉(zhuǎn)換詳解,Java 提供了 BigInteger(大整數(shù))類和 BigDecimal(大浮點數(shù))類用于大數(shù)運算,這兩個類都繼承自 Number 類(抽象類),由于 BigInteger 在大數(shù)運算中更常見,需要的朋友可以參考下2023-09-09

