Java生成N個(gè)不重復(fù)的隨機(jī)數(shù)的三種方法總結(jié)
1、Random類和Set集合來(lái)完成
Java實(shí)現(xiàn)生成n個(gè)不重復(fù)的隨機(jī)數(shù)可以使用Java中的Random類和Set集合來(lái)完成
具體代碼如下:
import java.util.HashSet; import java.util.Random; import java.util.Set; public class RandomNumberGenerator { public static Set<Integer> generateRandomNumbers(int n, int max) { if (n > max) { throw new IllegalArgumentException("n must be less than or equal to max"); } Set<Integer> set = new HashSet<>(); Random random = new Random(); while (set.size() < n) { int num = random.nextInt(max) + 1; set.add(num); } return set; } public static void main(String[] args) { Set<Integer> set = generateRandomNumbers(5, 100); System.out.println(set); } }
上述代碼中,使用了一個(gè)while循環(huán)來(lái)生成n個(gè)不重復(fù)的隨機(jī)數(shù)。在每次循環(huán)中,先生成一個(gè)范圍在1到max之間的隨機(jī)整數(shù),然后將其加入Set集合中,由于Set集合不允許元素重復(fù),所以會(huì)自動(dòng)去重,直到包含n個(gè)元素為止。最后返回生成的隨機(jī)數(shù)集合。
在main方法中,我們調(diào)用generateRandomNumbers方法來(lái)生成5個(gè)不重復(fù)的1到100之間的隨機(jī)數(shù),并使用System.out.println打印出來(lái),輸出結(jié)果類似于[4, 27, 52, 76, 97]
2、使用數(shù)組來(lái)存儲(chǔ)生成的隨機(jī)數(shù)
每次生成隨機(jī)數(shù)之前判斷數(shù)組中是否已經(jīng)存在該數(shù),如果存在就繼續(xù)生成下一個(gè)隨機(jī)數(shù),直到生成了n個(gè)不重復(fù)的數(shù)為止
實(shí)現(xiàn)代碼如下:
import java.util.Arrays; import java.util.Random; public class RandomNumberGenerator { public static int[] generateRandomNumbers(int n, int max) { if (n > max) { throw new IllegalArgumentException("n must be less than or equal to max"); } int[] arr = new int[n]; Random random = new Random(); for (int i = 0; i < n; i++) { int num; do { num = random.nextInt(max) + 1; } while (contains(arr, num)); arr[i] = num; } return arr; } private static boolean contains(int[] arr, int num) { for (int i : arr) { if (i == num) { return true; } } return false; } public static void main(String[] args) { int[] arr = generateRandomNumbers(5, 100); System.out.println(Arrays.toString(arr)); } }
上述代碼中,使用了一個(gè)for循環(huán)來(lái)生成n個(gè)不重復(fù)的隨機(jī)數(shù)。在每次循環(huán)中,先生成一個(gè)范圍在1到max之間的隨機(jī)整數(shù),然后調(diào)用contains方法來(lái)判斷該數(shù)是否已經(jīng)存在于數(shù)組中,如果不存在則加入數(shù)組。
在main方法中,我們調(diào)用generateRandomNumbers方法來(lái)生成5個(gè)不重復(fù)的1到100之間的隨機(jī)數(shù),并使用Arrays.toString打印出來(lái),輸出結(jié)果類似于[4, 27, 52, 76, 97]。
3、使用Fisher-Yates洗牌算法(也稱為Knuth洗牌算法)
除了使用Random類和Set集合或數(shù)組來(lái)生成n個(gè)不重復(fù)的隨機(jī)數(shù),還可以使用Fisher-Yates洗牌算法(也稱為Knuth洗牌算法)來(lái)實(shí)現(xiàn)。該算法的思路是:從原始數(shù)組中隨機(jī)選擇一個(gè)元素,將其與數(shù)組的第一個(gè)元素交換位置,然后從剩余的n-1個(gè)元素中隨機(jī)選擇一個(gè)元素,將其與數(shù)組的第二個(gè)元素交換位置,以此類推,直到遍歷完所有的n個(gè)元素為止。
具體實(shí)現(xiàn)代碼如下:
import java.util.Arrays; import java.util.Random; public class RandomNumberGenerator { public static int[] generateRandomNumbers(int n, int max) { if (n > max) { throw new IllegalArgumentException("n must be less than or equal to max"); } int[] arr = new int[max]; for (int i = 0; i < max; i++) { arr[i] = i + 1; } Random random = new Random(); for (int i = max - 1; i >= max - n; i--) { int index = random.nextInt(i + 1); int temp = arr[index]; arr[index] = arr[i]; arr[i] = temp; } return Arrays.copyOfRange(arr, max - n, max); } public static void main(String[] args) { int[] arr = generateRandomNumbers(5, 100); System.out.println(Arrays.toString(arr)); } }
上述代碼中,首先創(chuàng)建一個(gè)包含1到max的整數(shù)數(shù)組arr,然后使用Fisher-Yates洗牌算法來(lái)隨機(jī)打亂數(shù)組中的元素,最后返回?cái)?shù)組中的后n個(gè)元素。
在main方法中,我們調(diào)用generateRandomNumbers方法來(lái)生成5個(gè)不重復(fù)的1到100之間的隨機(jī)數(shù),并使用Arrays.toString打印出來(lái),輸出結(jié)果類似于[4, 27, 52, 76, 97]。
到此這篇關(guān)于Java生成N個(gè)不重復(fù)的隨機(jī)數(shù)的三種方法總結(jié)的文章就介紹到這了,更多相關(guān)Java生成不重復(fù)隨機(jī)數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 整合 Shiro+Thymeleaf過(guò)程解析
這篇文章主要介紹了Spring Boot 整合 Shiro+Thymeleaf過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴jar包)
這篇文章主要介紹了Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴jar包) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11基于Zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)功能
無(wú)論是采用SOA還是微服務(wù)架構(gòu),都需要使用服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)組件,本文將基于 Zookeeper 實(shí)現(xiàn)服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)功能,如果跟我一樣有同樣的困惑,希望可以通過(guò)本文了解其他組件如何使用 Zookeeper 作為注冊(cè)中心的工作原理2023-09-09JAVA使用Gson解析json數(shù)據(jù)實(shí)例解析
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,易于閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。接下來(lái)通過(guò)本文給大家介紹JAVA使用Gson解析json數(shù)據(jù)實(shí)例解析,需要的朋友參考下吧2016-03-03微服務(wù)Redis-Session共享登錄狀態(tài)的過(guò)程詳解
這篇文章主要介紹了微服務(wù)Redis-Session共享登錄狀態(tài),本文采取Spring security做登錄校驗(yàn),用redis做session共享,實(shí)現(xiàn)單服務(wù)登錄可靠性,微服務(wù)之間調(diào)用的可靠性與通用性,需要的朋友可以參考下2023-12-12自己手寫Mybatis通用batchInsert問(wèn)題
這篇文章主要介紹了自己手寫Mybatis通用batchInsert問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Spring MVC @GetMapping和@PostMapping注解的使用方式
這篇文章主要介紹了Spring MVC @GetMapping和@PostMapping注解的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05手把手帶你實(shí)現(xiàn)一個(gè)萌芽版的Spring容器
大家好,我是老三,Spring是我們最常用的開源框架,經(jīng)過(guò)多年發(fā)展,Spring已經(jīng)發(fā)展成枝繁葉茂的大樹,讓我們難以窺其全貌,這節(jié),我們回歸Spring的本質(zhì),五分鐘手?jǐn)]一個(gè)Spring容器,揭開Spring神秘的面紗2022-03-03