Java編程中隨機(jī)數(shù)的生成方式總結(jié)
本章先講解Java隨機(jī)數(shù)的幾種產(chǎn)生方式,然后通過示例對其進(jìn)行演示。
廣義上講,Java中的隨機(jī)數(shù)的有三種產(chǎn)生方式:
(01). 通過System.currentTimeMillis()來獲取一個當(dāng)前時間毫秒數(shù)的long型數(shù)字。
(02). 通過Math.random()返回一個0到1之間的double值。
(03). 通過Random類來產(chǎn)生一個隨機(jī)數(shù),這個是專業(yè)的Random工具類,功能強(qiáng)大。第1種 利用System.currentTimeMillis()獲取隨機(jī)數(shù)
通過System.currentTimeMillis()來獲取隨機(jī)數(shù)。實(shí)際上是獲取當(dāng)前時間毫秒數(shù),它是long類型。使用方法如下:
final long l = System.currentTimeMillis();
若要獲取int類型的整數(shù),只需要將上面的結(jié)果轉(zhuǎn)行成int類型即可。比如,獲取[0, 100)之間的int整數(shù)。方法如下:
final long l = System.currentTimeMillis(); final int i = (int)( l % 100 );
第2種 利用Math.random()獲取隨機(jī)數(shù)
通過Math.random()來獲取隨機(jī)數(shù)。實(shí)際上,它返回的是0(包含)到1(不包含)之間的double值。使用方法如下:
final double d = Math.random();
若要獲取int類型的整數(shù),只需要將上面的結(jié)果轉(zhuǎn)行成int類型即可。比如,獲取[0, 100)之間的int整數(shù)。方法如下:
final double d = Math.random(); final int i = (int)(d*100);
第3種 利用Random類來獲取隨機(jī)數(shù)
通過Random類來獲取隨機(jī)數(shù)。
使用方法如下:
(01) 創(chuàng)建Random對象。有兩種方法可以創(chuàng)建Random對象,如下:
Random random = new Random();//默認(rèn)構(gòu)造方法 Random random = new Random(1000);//指定種子數(shù)字
(02) 通過Random對象獲取隨機(jī)數(shù)。Random支持的隨機(jī)值類型包括:boolean, byte, int, long, float, double。
比如,獲取[0, 100)之間的int整數(shù)。方法如下:
int i2 = random.nextInt(100);
Random 的函數(shù)接口
// 構(gòu)造函數(shù)(一): 創(chuàng)建一個新的隨機(jī)數(shù)生成器。 Random() // 構(gòu)造函數(shù)(二): 使用單個 long 種子創(chuàng)建一個新隨機(jī)數(shù)生成器: public Random(long seed) { setSeed(seed); } next 方法使用它來保存隨機(jī)數(shù)生成器的狀態(tài)。 Random(long seed) boolean nextBoolean() // 返回下一個“boolean類型”偽隨機(jī)數(shù)。 void nextBytes(byte[] buf) // 生成隨機(jī)字節(jié)并將其置于字節(jié)數(shù)組buf中。 double nextDouble() // 返回一個“[0.0, 1.0) 之間的double類型”的隨機(jī)數(shù)。 float nextFloat() // 返回一個“[0.0, 1.0) 之間的float類型”的隨機(jī)數(shù)。 int nextInt() // 返回下一個“int類型”隨機(jī)數(shù)。 int nextInt(int n) // 返回一個“[0, n) 之間的int類型”的隨機(jī)數(shù)。 long nextLong() // 返回下一個“l(fā)ong類型”隨機(jī)數(shù)。 synchronized double nextGaussian() // 返回下一個“double類型”的隨機(jī)數(shù),它是呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,標(biāo)準(zhǔn)偏差是 1.0。 synchronized void setSeed(long seed) // 使用單個 long 種子設(shè)置此隨機(jī)數(shù)生成器的種子。
獲取隨機(jī)數(shù)示例
eg1:
下面通過示例演示上面3種獲取隨機(jī)數(shù)的使用方法。 源碼如下(RandomTest.java):
import java.util.Random; import java.lang.Math; /** * java 的隨機(jī)數(shù)測試程序。共3種獲取隨機(jī)數(shù)的方法: * (01)、通過System.currentTimeMillis()來獲取一個當(dāng)前時間毫秒數(shù)的long型數(shù)字。 * (02)、通過Math.random()返回一個0到1之間的double值。 * (03)、通過Random類來產(chǎn)生一個隨機(jī)數(shù),這個是專業(yè)的Random工具類,功能強(qiáng)大。 * * @author skywang * @email kuiwu-wang@163.com */ public class RandomTest{ public static void main(String args[]){ // 通過System的currentTimeMillis()返回隨機(jī)數(shù) testSystemTimeMillis(); // 通過Math的random()返回隨機(jī)數(shù) testMathRandom(); // 新建“種子為1000”的Random對象,并通過該種子去測試Random的API testRandomAPIs(new Random(1000), " 1st Random(1000)"); testRandomAPIs(new Random(1000), " 2nd Random(1000)"); // 新建“默認(rèn)種子”的Random對象,并通過該種子去測試Random的API testRandomAPIs(new Random(), " 1st Random()"); testRandomAPIs(new Random(), " 2nd Random()"); } /** * 返回隨機(jī)數(shù)-01:測試System的currentTimeMillis() */ private static void testSystemTimeMillis() { // 通過 final long l = System.currentTimeMillis(); // 通過l獲取一個[0, 100)之間的整數(shù) final int i = (int)( l % 100 ); System.out.printf("\n---- System.currentTimeMillis() ----\n l=%s i=%s\n", l, i); } /** * 返回隨機(jī)數(shù)-02:測試Math的random() */ private static void testMathRandom() { // 通過Math的random()函數(shù)返回一個double類型隨機(jī)數(shù),范圍[0.0, 1.0) final double d = Math.random(); // 通過d獲取一個[0, 100)之間的整數(shù) final int i = (int)(d*100); System.out.printf("\n---- Math.random() ----\n d=%s i=%s\n", d, i); } /** * 返回隨機(jī)數(shù)-03:測試Random的API */ private static void testRandomAPIs(Random random, String title) { final int BUFFER_LEN = 5; // 獲取隨機(jī)的boolean值 boolean b = random.nextBoolean(); // 獲取隨機(jī)的數(shù)組buf[] byte[] buf = new byte[BUFFER_LEN]; random.nextBytes(buf); // 獲取隨機(jī)的Double值,范圍[0.0, 1.0) double d = random.nextDouble(); // 獲取隨機(jī)的float值,范圍[0.0, 1.0) float f = random.nextFloat(); // 獲取隨機(jī)的int值 int i1 = random.nextInt(); // 獲取隨機(jī)的[0,100)之間的int值 int i2 = random.nextInt(100); // 獲取隨機(jī)的高斯分布的double值 double g = random.nextGaussian(); // 獲取隨機(jī)的long值 long l = random.nextLong(); System.out.printf("\n---- %s ----\nb=%s, d=%s, f=%s, i1=%s, i2=%s, g=%s, l=%s, buf=[", title, b, d, f, i1, i2, g, l); for (byte bt:buf) System.out.printf("%s, ", bt); System.out.println("]"); } }
eg2:
問題:生成(-10,10)之間的保留小數(shù)點(diǎn)后兩位數(shù)的隨機(jī)數(shù)。
解決方法:
1.java中隨機(jī)數(shù)生成函數(shù)Random r=new Random(); r.nextFloat();//生成(0,1)之間的浮點(diǎn)型隨機(jī)數(shù)。將上述隨機(jī)數(shù)乘以10,得到生成(0,10)之間的隨機(jī)數(shù)。
2.生成一個Boolean型的隨機(jī)數(shù)用于控制數(shù)的正負(fù):r.nextBoolean();
3.保留小數(shù)位數(shù)兩位的方法:Math.floor(n*100+0.5)/100;得到的數(shù)為double型。
代碼如下:
import java.util.*; public class CreateRandom { public float numRandom(){ float num; Random r=new Random(); float value = (float) (Math.floor(r.nextFloat()*1000+0.5)/100); Boolean b = r.nextBoolean(); if(b){ num = value; } else{ num=0-value; } return num; } public static void main(String[] args) { CreateRandom cr = new CreateRandom(); float num = cr.numRandom(); System.out.print(num); } }
- 如何用java生成指定范圍的隨機(jī)數(shù)
- Java中生成隨機(jī)數(shù)的實(shí)現(xiàn)方法總結(jié)
- Java生成隨機(jī)數(shù)的2種示例方法代碼
- 史上最全的java隨機(jī)數(shù)生成算法分享
- java生成指定范圍隨機(jī)數(shù)的多種代碼
- Java實(shí)現(xiàn)生成n個不重復(fù)的隨機(jī)數(shù)
- Java編程實(shí)現(xiàn)生成給定范圍內(nèi)不重復(fù)隨機(jī)數(shù)的方法小結(jié)
- java生成隨機(jī)數(shù)(字符串)示例分享
- Java中隨機(jī)數(shù)生成常見的幾種方式及適用場景
相關(guān)文章
Spring Cloud Gateway(讀取、修改 Request Body)的操作
這篇文章主要介紹了Spring Cloud Gateway(讀取、修改 Request Body)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12SpringBoot基于Redis實(shí)現(xiàn)token的在線續(xù)期的實(shí)踐
本文主要介紹了使用Redis實(shí)現(xiàn)JWT令牌在線續(xù)期的方案,通過在線續(xù)期token,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12簡單理解Java的垃圾回收機(jī)制與finalize方法的作用
這篇文章主要介紹了簡單理解Java的垃圾回收機(jī)制與finalize方法的作用,著重講解了Java的GC銷毀對象的過程,需要的朋友可以參考下2015-11-11SpringBoot整合ElasticSearch的示例代碼
本篇文章主要介紹了SpringBoot整合ElasticSearch的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09SpringAOP中基于注解實(shí)現(xiàn)通用日志打印方法詳解
這篇文章主要介紹了SpringAOP中基于注解實(shí)現(xiàn)通用日志打印方法詳解,在日常開發(fā)中,項(xiàng)目里日志是必不可少的,一般有業(yè)務(wù)日志,數(shù)據(jù)庫日志,異常日志等,主要用于幫助程序猿后期排查一些生產(chǎn)中的bug,需要的朋友可以參考下2023-12-12Java?EasyExcel實(shí)現(xiàn)合并相同內(nèi)容單元格與動態(tài)標(biāo)題功能
這篇文章主要為大家詳細(xì)介紹了Java?EasyExcel如何實(shí)現(xiàn)合并相同內(nèi)容單元格與動態(tài)標(biāo)題功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下2023-12-12淺談常用Java數(shù)據(jù)庫連接池(小結(jié))
這篇文章主要介紹了淺談常用Java數(shù)據(jù)庫連接池(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Java使用easyExcel導(dǎo)出數(shù)據(jù)及單元格多張圖片
除了平時簡單的數(shù)據(jù)導(dǎo)出需求外,我們也經(jīng)常會遇到一些有固定格式或者模板要求的數(shù)據(jù)導(dǎo)出,下面這篇文章主要給大家介紹了關(guān)于Java使用easyExcel導(dǎo)出數(shù)據(jù)及單元格多張圖片的相關(guān)資料,需要的朋友可以參考下2023-05-05