java生成指定范圍隨機(jī)數(shù)的多種代碼
生成指定范圍內(nèi)的隨機(jī)數(shù)這個(gè)是最常用的技術(shù)之一,程序員希望通過隨機(jī)數(shù)的方式來處理眾多的業(yè)務(wù)邏輯,測(cè)試過程中也希望通過隨機(jī)數(shù)的方式生成包含大量數(shù)字的測(cè)試用例。
問題往往類似于:
如何隨機(jī)生成 1~100 之間的隨機(jī)數(shù),取值包含邊界值 1 和 100。
或者是:
如何隨機(jī)生成隨機(jī)的3位整數(shù)?
等等……
以 Java 語言為例,我們觀察其 Random 對(duì)象的 nextInt(int) 方法,發(fā)現(xiàn)這個(gè)方法將生成 0 ~ 參數(shù)之間隨機(jī)取值的整數(shù)。例如(假設(shè)先有 Random rand = newRandom();,下同):
rand.nextInt(100);
這行代碼將生成范圍0~100 之間的隨機(jī)數(shù),有趣的是,取值可能為 0 ,但不可能為 100。我們用中學(xué)數(shù)學(xué)課學(xué)習(xí)的區(qū)間表示法,表示為:[0, 100)。
那么如果要獲得區(qū)間 [1~100]的隨機(jī)數(shù),該怎么辦呢?稍微動(dòng)動(dòng)腦筋就可以想到:區(qū)間 [0, 100) 內(nèi)的整數(shù),實(shí)際上就是區(qū)間 [0, 99]。因?yàn)樽畲筮吔鐬?00,可惜不能等于100,因此最大可能產(chǎn)生的“整數(shù)”就是99。
既然rand.nextInt(100) 獲得的值是區(qū)間 [0, 99],那么在這個(gè)區(qū)間左右各加 1,就得到了區(qū)間 [1, 100]。因此,代碼寫成:
rand.nextInt(100)+ 1;
即可。運(yùn)行下面的代碼,將獲得 [1, 100] 的 10 個(gè)取值。
import java.util.Random;
public class Test {
public static void main(String[] args){
Random rand = new Random();
for(int i=0; i<10; i++) {
System.out.println(rand.nextInt(100) + 1);
}
}
}
同理,很容易知道如果要獲得隨機(jī)兩位整數(shù),代碼寫成:rand.nextInt(90) + 10;
你一定很驚訝,為什么是這么寫出來的。其實(shí),在 nextInt() 方法中作為參數(shù)的數(shù)字 90 表示:你希望生成的隨機(jī)數(shù)的所有取值的可能性的數(shù)量(在本命題中,兩位整數(shù)取值為 [10, 99],共90個(gè)數(shù));加好后面的數(shù)字 10 ,表示區(qū)間的最小取值。
你可以驗(yàn)證下,按照這樣理解,[1, 100] 的隨機(jī)數(shù),是不是應(yīng)該寫成rand.nextInt(100) + 1 。千萬不要把參數(shù) 100 理解為最大取值。只是區(qū)間 [1, 100] 正好從 1 開始,所以最大取值和取值可能性數(shù)量正好同為 100。
因此,
生成隨機(jī)三位數(shù)的代碼為:
rand.nextInt(900)+ 100;
生成區(qū)間 [64,128] 中隨機(jī)值的代碼為:
rand.nextInt(65)+ 64;
取值可能性的數(shù)量是如何計(jì)算出來的呢?當(dāng)然是 最大取值-最小取值+1 ,所以,有最終公式如下:
// For Java
int randNumber =rand.nextInt(MAX - MIN + 1) + MIN; // randNumber 將被賦值為一個(gè) MIN 和 MAX 范圍內(nèi)的隨機(jī)數(shù)
下面腳本之家小編分享一個(gè)網(wǎng)上常用的函數(shù)
函數(shù)一、要生成在[min,max]之間的隨機(jī)整數(shù)
import java.util.Random;
public class RandomTest {
public static void main(String[] args) {
int max=20;
int min=10;
Random random = new Random();
int s = random.nextInt(max)%(max-min+1) + min;
System.out.println(s);
}
}
random.nextInt(max)表示生成[0,max]之間的隨機(jī)數(shù),然后對(duì)(max-min+1)取模。
以生成[10,20]隨機(jī)數(shù)為例,首先生成0-20的隨機(jī)數(shù),然后對(duì)(20-10+1)取模得到[0-10]之間的隨機(jī)數(shù),然后加上min=10,最后生成的是10-20的隨機(jī)數(shù)
函數(shù)二、
import java.util.*;
import java.io.*;
public class Random_Different {
public static void main(String[] args) throws IOException{
System.out.print("輸入產(chǎn)生的隨機(jī)數(shù)范圍,1到N,N=");
int n=0;
try{
n=Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
}catch(Exception e){
System.out.println("N必須為正整數(shù)");
return;
}
if(n<1){
System.out.println("N必須為正數(shù)");
return;
}
int randArr[]=new int[n];
int i=0;
while(i<n){
int rand=(new Random().nextInt(n)+1);
boolean isRandExist=false;
for(int j=0;j<randArr.length;j++){
if(randArr[j]==rand){
isRandExist=true;
break;
}
}
if(isRandExist==false){
randArr[i]=rand;
i++;
}
}
System.out.println(Arrays.toString(randArr));
}
}
首先在1~n產(chǎn)生一個(gè)隨機(jī)數(shù)X,然后對(duì)這個(gè)之前產(chǎn)生的數(shù)據(jù)進(jìn)行遍歷,判斷是否存在有數(shù)等于這個(gè)新產(chǎn)生的隨機(jī)數(shù)的,如果有,立flag,
然后對(duì)之前的數(shù)據(jù)遍歷完畢之后,判斷flag是否立起來,
如果是,就不添加這個(gè)隨機(jī)數(shù)進(jìn)數(shù)組,重新產(chǎn)生隨機(jī)數(shù)并收起flag,再重新遍歷已有的數(shù)據(jù)中是否已有這個(gè)隨機(jī)數(shù),
如果否,就添加,直到n個(gè)數(shù)據(jù)產(chǎn)生完畢。
最后輸出這個(gè)n個(gè)數(shù)據(jù)。
具體的運(yùn)行效果如下:

為了說明這個(gè)程序是健壯的,讓電腦輸入N,其中這個(gè)N從1-20,可以觀察到,輸出的數(shù)組中沒有一個(gè)數(shù)是相同的,完成任務(wù)!

更多的數(shù)也是沒有問題的,你設(shè)置N=二十萬,都沒有問題,這里由于本猿猴的機(jī)器太渣,設(shè)置個(gè)N=33說明效果。

- 如何用java生成指定范圍的隨機(jī)數(shù)
- Java中生成隨機(jī)數(shù)的實(shí)現(xiàn)方法總結(jié)
- Java生成隨機(jī)數(shù)的2種示例方法代碼
- 史上最全的java隨機(jī)數(shù)生成算法分享
- Java實(shí)現(xiàn)生成n個(gè)不重復(fù)的隨機(jī)數(shù)
- Java編程實(shí)現(xiàn)生成給定范圍內(nèi)不重復(fù)隨機(jī)數(shù)的方法小結(jié)
- Java編程中隨機(jī)數(shù)的生成方式總結(jié)
- java生成隨機(jī)數(shù)(字符串)示例分享
- Java中隨機(jī)數(shù)生成常見的幾種方式及適用場(chǎng)景
相關(guān)文章
Java操作mongodb增刪改查的基本操作實(shí)戰(zhàn)指南
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫,由c++語言編寫,旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案,下面這篇文章主要給大家介紹了關(guān)于Java操作mongodb增刪改查的基本操作實(shí)戰(zhàn)指南,需要的朋友可以參考下2023-05-05
關(guān)于Springboot數(shù)據(jù)庫配置文件明文密碼加密解密的問題
這篇文章主要介紹了Springboot數(shù)據(jù)庫配置文件明文密碼加密解密的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
SpringBoot使用iText7實(shí)現(xiàn)將HTML轉(zhuǎn)成PDF并添加頁眉頁腳水印
這篇文章主要為大家詳細(xì)介紹了SpringBoot使用iText7實(shí)現(xiàn)將HTML轉(zhuǎn)成PDF并添加頁眉頁腳水印的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
java高并發(fā)情況下高效的隨機(jī)數(shù)生成器
這篇文章主要介紹了java高并發(fā)情況下高效的隨機(jī)數(shù)生成器,對(duì)于性能有要求的同學(xué),可以參考下2021-04-04
Java阻塞隊(duì)列的實(shí)現(xiàn)及應(yīng)用
這篇文章主要介紹了剖析Java中阻塞隊(duì)列的實(shí)現(xiàn)原理及應(yīng)用場(chǎng)景,這里也對(duì)阻塞和非阻塞隊(duì)列的不同之處進(jìn)行了對(duì)比,需要的朋友可以參考下2021-10-10
springboot項(xiàng)目以jar包運(yùn)行的操作方法
公司一個(gè)springboot項(xiàng)目本來是打war包的,突然要改為打jar包,不知所措了,糾結(jié)該如何操作呢,折騰半天終于搞定了,下面把解決方案分享給大家,對(duì)springboot打jar包方式感興趣的朋友一起看看吧2021-06-06
SpringBoot三種方法接口返回日期格式化小結(jié)
本文介紹了三種在Spring Boot中格式化接口返回日期的方法,包含使用@JsonFormat注解、全局配置JsonConfig、以及在yml文件中配置時(shí)區(qū),具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
Java實(shí)現(xiàn)簡(jiǎn)單的郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的郵件發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

