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

Java生成N個(gè)不重復(fù)的隨機(jī)數(shù)的三種方法總結(jié)

 更新時(shí)間:2023年10月08日 14:54:15   作者:芒果很忙耶  
這篇文章主要為大家詳細(xì)介紹了三種Java生成N個(gè)不重復(fù)的隨機(jī)數(shù)的方法,文中的示例代碼講解詳細(xì),具有一定的參考價(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ò)程解析

    這篇文章主要介紹了Spring Boot 整合 Shiro+Thymeleaf過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴jar包)

    Maven如何構(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)功能

    基于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-09
  • Java實(shí)現(xiàn)后端跨域的常見解決方案

    Java實(shí)現(xiàn)后端跨域的常見解決方案

    跨源資源共享(CORS——Cross-Origin Resource Sharing,跨源資源共享,或通俗地譯為跨域資源共享)是一種基于 HTTP 頭的機(jī)制,跨域的解決方案有很多種,前后端都有,本文給大家主要介紹Java實(shí)現(xiàn)后端跨域的常見解決方案,需要的朋友可以參考下
    2024-04-04
  • JAVA使用Gson解析json數(shù)據(jù)實(shí)例解析

    JAVA使用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
  • Java中的TreeSet源碼解讀

    Java中的TreeSet源碼解讀

    這篇文章主要介紹了Java中的TreeSet源碼解讀,TreeSet 是一個(gè) 有序集合,它擴(kuò)展了 AbstractSet 類并實(shí)現(xiàn)了 NavigableSet 接口,對(duì)象根據(jù)其自然順序以升序排序和存儲(chǔ),該 TreeSet 中使用 平衡樹,更具體的一個(gè) 紅黑樹,需要的朋友可以參考下
    2023-09-09
  • 微服務(wù)Redis-Session共享登錄狀態(tài)的過(guò)程詳解

    微服務(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)題

    這篇文章主要介紹了自己手寫Mybatis通用batchInsert問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Spring MVC @GetMapping和@PostMapping注解的使用方式

    Spring MVC @GetMapping和@PostMapping注解的使用方式

    這篇文章主要介紹了Spring MVC @GetMapping和@PostMapping注解的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 手把手帶你實(shí)現(xiàn)一個(gè)萌芽版的Spring容器

    手把手帶你實(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

最新評(píng)論