欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java獲取隨機(jī)數(shù)的n種方法

 更新時間:2023年11月13日 09:08:06   作者:way_more  
項(xiàng)目中,我們常常會用到隨機(jī)數(shù),本文主要介紹了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)文章

最新評論