實(shí)例講解Java中random.nextInt()與Math.random()的基礎(chǔ)用法
1、來(lái)源
random.nextInt() 為 java.util.Random類中的方法;
Math.random() 為 java.lang.Math 類中的靜態(tài)方法。
2、用法
產(chǎn)生0-n的偽隨機(jī)數(shù)(偽隨機(jī)數(shù)參看最后注解):
// 兩種生成對(duì)象方式:帶種子和不帶種子(兩種方式的區(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)用,生成一個(gè)隨機(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)用;
- 如無(wú)特殊需求,則使用(int)(Math.random()*n)的方式生成隨機(jī)數(shù)即可。
5、注:何謂偽隨機(jī)數(shù)
偽隨機(jī)既有規(guī)則的隨機(jī),Random類中的隨機(jī)算法就是偽隨機(jī)。
具體表現(xiàn)為:相同種子數(shù)的Random對(duì)象生成的隨機(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)只使用一個(gè)Random類。而Math類中的隨機(jī)數(shù)生成器 randomNumberGenerator 對(duì)象為靜態(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)時(shí)間相關(guān)的一個(gè)數(shù)字作為種子數(shù),該種子數(shù)只作為隨機(jī)算法的起源數(shù)字,與生成的隨機(jī)數(shù)區(qū)間無(wú)關(guān)系。
這篇文章是我對(duì)Java中隨機(jī)數(shù)的一些簡(jiǎn)單的理解,如有不對(duì)的地方或者其他的見解歡迎指導(dǎo)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql
這篇文章主要給大家介紹了關(guān)于JDBC中如何使用Java8的日期LocalDate和LocalDateTime的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
spring boot 配置動(dòng)態(tài)刷新實(shí)現(xiàn)詳解
這篇文章主要介紹了spring boot 配置動(dòng)態(tài)刷新實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑
本文主要介紹了SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
淺談Spring中幾個(gè)PostProcessor的區(qū)別與聯(lián)系
這篇文章主要介紹了淺談Spring中幾個(gè)PostProcessor的區(qū)別與聯(lián)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot2.x實(shí)現(xiàn)給Controller的RequestMapping添加統(tǒng)一前綴
這篇文章主要介紹了SpringBoot2.x實(shí)現(xiàn)給Controller的RequestMapping添加統(tǒng)一前綴,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot返回對(duì)象時(shí),如何將Long類型轉(zhuǎn)換為String
這篇文章主要介紹了SpringBoot返回對(duì)象時(shí),實(shí)現(xiàn)將Long類型轉(zhuǎn)換為String,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Java中實(shí)現(xiàn)String.padLeft和String.padRight的示例
本篇文章主要介紹了Java中實(shí)現(xiàn)String.padLeft和String.padRight,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-09-09
Echarts+SpringMvc顯示后臺(tái)實(shí)時(shí)數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Echarts+SpringMvc顯示后臺(tái)實(shí)時(shí)數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12

