JavaSE API實(shí)現(xiàn)生成隨機(jī)數(shù)的2種方法(Random類和Math類的Random方法)
生成隨機(jī)數(shù)的兩種方法
Random類和Math類的random方法都可以用來(lái)生成隨機(jī)數(shù)
而Math類的random方法則是基于系統(tǒng)時(shí)間的偽隨機(jī)數(shù)生成器,大于等于0.0小于1.0的隨機(jī)double值范圍[0,1)。例如: double num1 = Math.random() * 5 + 4;//范圍[4,9)
Random類是基于種子的偽隨機(jī)數(shù)生成器,有含參數(shù)和不含參數(shù)兩種構(gòu)造方式,不含參數(shù)的構(gòu)造方法每次都使用當(dāng)前系統(tǒng)時(shí)間作為種子,而含餐構(gòu)造是使用一個(gè)固定值(參數(shù)n)作為種子范圍[0,n)。例如:Random rd1 = new Random(); double num2 = rd1.nextDouble(); Random rd2 = new Random(10); double num3 = rd2.nextDouble();
Math.random() 無(wú)參調(diào)用,返回值為 double,大于等于 0.0 ,小于 1.0。范圍[0.0,1.0)
static double random?() 返回值為 double的正值,大于等于 0.0 ,小于 1.0 。
double randomDouble = Math.random(); // 生成[0,1)之間的隨機(jī)小數(shù) int randomNumber = (int) (2 + Math.random() * 101); // 生成[2,103)之間的隨機(jī)整數(shù)
Random類對(duì)象的next()方法,可有參。從這個(gè)隨機(jī)數(shù)生成器的序列返回下一個(gè)偽隨機(jī)數(shù),均勻分布的 int值。
protected int next?(int bits) 生成下一個(gè)偽隨機(jī)數(shù)。
boolean nextBoolean?() 從該隨機(jī)數(shù)生成器的序列返回下一個(gè)偽隨機(jī)數(shù),均勻分布的 boolean值。
void nextBytes?(byte[] bytes) 生成隨機(jī)字節(jié)并將它們放入用戶提供的字節(jié)數(shù)組中。
double nextDouble?() 返回下一個(gè)偽,均勻分布 double之間價(jià)值 0.0和 1.0從這個(gè)隨機(jī)數(shù)生成器的序列。
float nextFloat?() 返回下一個(gè)偽,均勻分布 float之間價(jià)值 0.0和 1.0從這個(gè)隨機(jī)數(shù)生成器的序列。
double nextGaussian?() 從該隨機(jī)數(shù)發(fā)生器的序列返回下一個(gè)偽隨機(jī)數(shù),高斯(“正”)分布的 double值,平均值為 0.0 ,標(biāo)準(zhǔn)偏差為 1.0 。
int nextInt?() 從這個(gè)隨機(jī)數(shù)生成器的序列返回下一個(gè)偽隨機(jī)數(shù),均勻分布的 int值。
int nextInt?(int bound) 返回偽隨機(jī)的,均勻分布 int值介于0(含)和指定值(不包括),從該隨機(jī)數(shù)生成器的序列繪制。
long nextLong?() 返回下一個(gè)偽隨機(jī)數(shù),從這個(gè)隨機(jī)數(shù)發(fā)生器的序列中均勻分布 long值。
public static void main(String[] args) {
//測(cè)試一下生成隨機(jī)數(shù)的兩種方法
int i = 0;
for (i = 0; i < 10000; i++) {
System.out.println("=====================================");
double numDouble1 = Math.random();
int numInt1 = (int)(Math.random()*(10));
System.out.println("Math.random的隨機(jī)浮點(diǎn)數(shù)[0.0,1.0):" + numDouble1);
System.out.println("Math.random的隨機(jī)整數(shù)[0,9]" + numInt1);
System.out.println("---------------------------------------");
Random rd = new Random();
double numDouble2 = rd.nextDouble();
int numInt2 = rd.nextInt();
int numInt3 = rd.nextInt();
int numInt4 = rd.nextInt(4);
int numInt5 = rd.nextInt(4);
System.out.println("Random對(duì)象的無(wú)參隨機(jī)浮點(diǎn)數(shù)[0.0,1.0]:" + numDouble2);//不知道邊界情況,沒(méi)人說(shuō)過(guò),只說(shuō)之間。不管了,反正都用Math類
System.out.println("Random對(duì)象的無(wú)參隨機(jī)整數(shù)[-整數(shù),整數(shù)]:" + numInt2 + "," + numInt3);
System.out.println("Random對(duì)象的參數(shù)構(gòu)造[0,4):" + numInt5 + "," + numInt4);
}
System.out.println("執(zhí)行" + i + "次");
}
}
Random有參構(gòu)造后,調(diào)用方法生成隨機(jī)數(shù),數(shù)完全相同
只要Random構(gòu)造的參數(shù)固定,生成的隨機(jī)數(shù)也固定,完全不隨機(jī)。不推薦使用
System.out.println("--------------------------------------");
Random rd1 = new Random(10);
double numDouble3 = rd1.nextDouble();
Random rd2 = new Random(10);
double numDouble4 = rd2.nextDouble();
System.out.println("參數(shù)10的Random對(duì)象生成的隨機(jī)浮點(diǎn)數(shù)" + numDouble3 + "," + numDouble4);//因?yàn)榉N子相同,所以生成的數(shù)也相同
System.out.println("參數(shù)10的Random對(duì)象生成的隨機(jī)整數(shù)[0,5):" + numInt6 );
其中三次運(yùn)行結(jié)果
===================================== Math.random的隨機(jī)浮點(diǎn)數(shù)[0.0,1.0):0.7142916697602802 Math.random的隨機(jī)整數(shù)[0,9]:6 --------------------------------------- Random對(duì)象的無(wú)參隨機(jī)浮點(diǎn)數(shù)[0.0,1.0]:0.6315568322991557 Random對(duì)象的無(wú)參隨機(jī)整數(shù)[-整數(shù),整數(shù)]:73848388,929911462 Random對(duì)象的參數(shù)構(gòu)造[0,4):0,0 -------------------------------------- 參數(shù)10的Random對(duì)象生成的隨機(jī)浮點(diǎn)數(shù):0.7304302967434272,0.7304302967434272 參數(shù)10的Random對(duì)象生成的隨機(jī)整數(shù)[0,5):3 ===================================== Math.random的隨機(jī)浮點(diǎn)數(shù)[0.0,1.0):0.6622105346737387 Math.random的隨機(jī)整數(shù)[0,9]:4 --------------------------------------- Random對(duì)象的無(wú)參隨機(jī)浮點(diǎn)數(shù)[0.0,1.0]:0.7790519044760864 Random對(duì)象的無(wú)參隨機(jī)整數(shù)[-整數(shù),整數(shù)]:-1185189383,-718067040 Random對(duì)象的參數(shù)構(gòu)造[0,4):2,2 -------------------------------------- 參數(shù)10的Random對(duì)象生成的隨機(jī)浮點(diǎn)數(shù):0.7304302967434272,0.7304302967434272 參數(shù)10的Random對(duì)象生成的隨機(jī)整數(shù)[0,5):3 ===================================== Math.random的隨機(jī)浮點(diǎn)數(shù)[0.0,1.0):0.4240920821616745 Math.random的隨機(jī)整數(shù)[0,9]:8 --------------------------------------- Random對(duì)象的無(wú)參隨機(jī)浮點(diǎn)數(shù)[0.0,1.0]:0.36926846454559725 Random對(duì)象的無(wú)參隨機(jī)整數(shù)[-整數(shù),整數(shù)]:1829129943,120476504 Random對(duì)象的參數(shù)構(gòu)造[0,4):2,0 -------------------------------------- 參數(shù)10的Random對(duì)象生成的隨機(jī)浮點(diǎn)數(shù):0.7304302967434272,0.7304302967434272 參數(shù)10的Random對(duì)象生成的隨機(jī)整數(shù)[0,5):3
總結(jié):
1.Math.random方法明確范圍[0,1)
2.Random類無(wú)參構(gòu)造時(shí),無(wú)參調(diào)用方法生成隨機(jī)數(shù)都為該類型數(shù)的范圍,但如double為0.0~1.0之間但不清楚邊界包含情況,慎用
3.Random類有參構(gòu)造時(shí),若參數(shù)固定,不管有參還是無(wú)參調(diào)用方法得到的數(shù)都相同如
Random rd2 = new Random(10);
double numDouble4 = rd2.nextDouble();//循環(huán)多少次都固定產(chǎn)生0.7304302967434272
int numInt6 = rd2.nextInt(5);//固定產(chǎn)生3到此這篇關(guān)于JavaSE API實(shí)現(xiàn)生成隨機(jī)數(shù)的2種方法(Random類和Math類的Random方法)的文章就介紹到這了,更多相關(guān)JavaSE 生成隨機(jī)數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javaweb如何實(shí)現(xiàn)請(qǐng)求和響應(yīng)
這篇文章主要為大家詳細(xì)介紹了javaweb如何實(shí)現(xiàn)請(qǐng)求和響應(yīng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Spring?Boot項(xiàng)目啟動(dòng)報(bào)錯(cuò)Unable?to?start?web?server解決方法
這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目啟動(dòng)報(bào)錯(cuò)Unable?to?start?web?server的解決方法,錯(cuò)誤內(nèi)容大概的意思是未能加載嵌入的供web應(yīng)用加載的空間,是因?yàn)槿鄙賁ervletWebServerFactorybean,需要的朋友可以參考下2024-07-07
Spring模塊詳解之Spring ORM和Spring Transaction詳解
Spring ORM 是 Spring 框架的模塊之一,旨在簡(jiǎn)化與 JPA、Hibernate、JDO 等 ORM 工具的集成,通過(guò)提供統(tǒng)一的 API 和模板類,如 HibernateTemplate 和 JpaTemplate,Spring ORM 使開發(fā)者可以更便捷地執(zhí)行數(shù)據(jù)庫(kù)操作,感興趣的朋友跟隨小編一起看看吧2024-09-09
servlet上傳文件實(shí)現(xiàn)代碼詳解(四)
這篇文章主要為大家詳細(xì)介紹了servlet上傳文件的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
使用Jenv管理多版本JDK環(huán)境的詳細(xì)教程
在現(xiàn)代 Java 開發(fā)中,我們經(jīng)常需要在不同的項(xiàng)目中使用不同版本的 JDK,手動(dòng)切換 JAVA_HOME 環(huán)境變量既繁瑣又容易出錯(cuò),Jenv 是一個(gè)優(yōu)秀的 JDK 版本管理工具,可以讓我們輕松地在不同 JDK 版本間切換,所以本文給大家介紹了使用Jenv管理多版本JDK環(huán)境的詳細(xì)教程2025-08-08
Springboot WebFlux集成Spring Security實(shí)現(xiàn)JWT認(rèn)證的示例
這篇文章主要介紹了Springboot WebFlux集成Spring Security實(shí)現(xiàn)JWT認(rèn)證的示例,幫助大家更好的理解和學(xué)習(xí)使用springboot框架,感興趣的朋友可以了解下2021-04-04
Java基礎(chǔ)知識(shí)之I/O流和File類文件操作
眾所周知java語(yǔ)言提供給程序員非常多的包供編程時(shí)使用,方便又快捷,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)知識(shí)之I/O流和File類文件操作的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04

