Java獲取隨機(jī)數(shù)的n種方法
前言
在項(xiàng)目中,我們常常會用到隨機(jī)數(shù),那你知道幾種隨機(jī)數(shù)的生成方法呢,在這里,分享一下我知道的隨機(jī)數(shù)生成方法
1、使用Math.random()方法
Math.random() 產(chǎn)生的隨機(jī)數(shù)是0-1之間的一個double數(shù)值,有15位小數(shù),我們可以把他乘以一定的數(shù),比如說乘以100,他就是個100以內(nèi)的隨機(jī)
Math.random()獲取到的隨機(jī)數(shù)如下
0.6195107792727859
如下,為獲取1到10的int類型隨機(jī)數(shù),+1表示最小值為1,因?yàn)閞andom方法的最小值是0
(int)(1+Math.random()*10)
生成0到9的隨機(jī)數(shù),如下
(int)(Math.random()*10)
想要獲得比m小1的int或者long類型數(shù)值,只需要使用以下公式
(類型)(Math.random()*m)
想要獲得指定范圍[最小值,最大值]的隨機(jī)數(shù),使用以下公式
(數(shù)據(jù)類型)(最小值+Math.random()*(最大值-最小值+1))
例:獲取10到99的隨機(jī)數(shù)
(int)(Math.random()*90+10)
注意:Math.random() 產(chǎn)生的隨機(jī)數(shù)是大于等于0,小于1(不等于1)的double數(shù)值
2、Random類
通過Random類來產(chǎn)生一個隨機(jī)數(shù),這個是專業(yè)的Random工具類,功能強(qiáng)大。
使用方法如下:
(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);
構(gòu)造方法:
// 構(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ù)。
提示:所以若非必要,不要設(shè)置隨機(jī)數(shù)種子。
因?yàn)樵贘ava中,隨機(jī)數(shù)的產(chǎn)生取決于種子,隨機(jī)數(shù)和種子之間的關(guān)系遵從以下兩個規(guī)則:
種子不同,產(chǎn)生不同的隨機(jī)數(shù)。
種子相同,即使實(shí)例不同也產(chǎn)生相同的隨機(jī)數(shù)。
如下:
Random random1=new Random(1000); Random random2=new Random(1000); for (int i=0;i<10;i++){ System.out.print(random1.nextInt(100)); } System.out.println(); for (int i=0;i<10;i++){ System.out.print(random2.nextInt(100)); }
輸出
87357624924941456450
87357624924941456450
可以看到,兩個不同的實(shí)例,但輸出的隨機(jī)數(shù)是一模一樣的,這就是因?yàn)榉N子相同,所以我們一般不要指定一個種子。
Random()無參構(gòu)造方法使用的是一個時間值,所以每一次的seed值都不一樣
public Random() { this(seedUniquifier() ^ System.nanoTime()); }
3、ThreadLocalRandom
ThreadLocalRandom類是Java 7新增的一個類,它是Random的增強(qiáng)版。在并發(fā)訪問的環(huán)境下,使用ThreadLocalRandom來代替Random可以減少多線程資源競爭,最終保證系統(tǒng)具有更好的線程安全性。
我們聯(lián)想一下ThreadLocal。ThreadLocal通過讓每一個線程復(fù)制一份變量,使得在每個線程對變量進(jìn)行操作時實(shí)際是操作自己本地內(nèi)存里面的副本,從而避免了對共享變量進(jìn)行同步。
實(shí)際上ThreadLocalRandom的實(shí)現(xiàn)也是這個原理,Random的缺點(diǎn)是多個線程會使用同一個原子性種子變量,從而導(dǎo)致對原子變量更新的競爭。
ThreadLocalRandom類的用法與Random類的用法基本相似,它提供了一個靜態(tài)的current()方法來獲取ThreadLocalRandom對象,獲取該對象之后即可調(diào)用各種nextInt()方法來獲取偽隨機(jī)數(shù)了。
ThreadLocalRandom與Random都比Math的random()方法提供了更多的方式來生成各種偽隨機(jī)數(shù)。可以生成浮點(diǎn)類型的偽隨機(jī)數(shù),也可以生成整型類型的偽隨機(jī)數(shù),還可以指定生成隨機(jī)數(shù)的范圍。
ThreadLocalRandom rand = ThreadLocalRandom.current(); //生成一個4~20的偽隨機(jī)整數(shù) int val1 = rand.nextInt(4 , 20); //生成一個2.0~10.0之間的偽隨機(jī)浮點(diǎn)數(shù) double val2 = rand.nextDouble(2.0 , 10.0);
4、UUID
UUID是jdk1.5中新增的一個類,在java.util下,用它可以產(chǎn)生一個號稱全球唯一的ID
UUID生成的形式如下,會有-,所以我們一般會把-去掉
aec0ae4d-59f9-4070-8c5b-13c00a4611b6
使用:
String uuid = UUID.randomUUID().toString(); uuid = uuid.replace("-", "");
5、 獲取字母和數(shù)字的隨機(jī)數(shù)
如果我們想獲取一個字母和數(shù)字的隨機(jī)數(shù),我們可以使用以下方法
public static final String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; public static String getRandomString(int length){ Random random=new Random(); StringBuffer sb=new StringBuffer(); for(int i=0;i<length;i++){ int number=random.nextInt(62); sb.append(str.charAt(number)); } return sb.toString(); }
到此這篇關(guān)于Java獲取隨機(jī)數(shù)的n種方法的文章就介紹到這了,更多相關(guān)Java獲取隨機(jī)數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Spring框架之基于Restful風(fēng)格實(shí)現(xiàn)的SpringMVC
這篇文章主要介紹了詳解Spring框架之基于Restful風(fēng)格實(shí)現(xiàn)的SpringMVC,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05Spring MVC結(jié)合Spring Data JPA實(shí)現(xiàn)按條件查詢和分頁
這篇文章主要為大家詳細(xì)介紹了Spring MVC結(jié)合Spring Data JPA實(shí)現(xiàn)按條件查詢,以及分頁效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10Spring Cloud Stream如何實(shí)現(xiàn)服務(wù)之間的通訊
這篇文章主要介紹了Spring Cloud Stream如何實(shí)現(xiàn)服務(wù)之間的通訊,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10mybatis3.4.0不支持LocalDateTime的解決方法(No typehandler f
本文主要介紹了mybatis3.4.0不支持LocalDateTime的解決方法(No typehandler found for property time),具有一定的參考價值,感興趣的可以了解一下2025-03-03Springboot2.x 使用 Log4j2 異步打印日志的實(shí)現(xiàn)
這篇文章主要介紹了Springboot2.x 使用 Log4j2 異步打印日志的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12深入解析Java設(shè)計模式編程中觀察者模式的運(yùn)用
這篇文章主要介紹了Java設(shè)計模式編程中觀察者模式的運(yùn)用,觀察者模式主要是為了將對象進(jìn)行與被觀察者一樣的實(shí)現(xiàn),需要的朋友可以參考下2016-02-02Java?HashTable與Collections.synchronizedMap源碼深入解析
HashTable是jdk?1.0中引入的產(chǎn)物,基本上現(xiàn)在很少使用了,但是會在面試中經(jīng)常被問到。本文就來帶大家一起深入了解一下Hashtable,需要的可以參考一下2022-11-11一文深入分析java.lang.ClassNotFoundException異常
這篇文章主要給大家介紹了關(guān)于java.lang.ClassNotFoundException異常的相關(guān)資料,java.lang.ClassNotFoundException是Java編程時經(jīng)常會遇到的一個異常,它表示JVM在嘗試加載某個類時未能找到該類,需要的朋友可以參考下2023-10-10