亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中生成不重復隨機數(shù)的四種方法舉例詳解

 更新時間:2025年04月10日 08:31:58   作者:索大l  
在Java編程中獲取隨機數(shù)是常見的需求,這篇文章主要介紹了Java中生成不重復隨機數(shù)的四種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

摘要:

在Java開發(fā)中,生成不重復的隨機數(shù)是常見的需求,例如抽獎、隨機抽樣等場景。本文提供四種高效實現(xiàn)方案,涵蓋不同范圍與數(shù)據(jù)量的場景,并附完整代碼示例。

 一、需求場景分析

生成不重復隨機數(shù)的核心問題是“如何避免重復”。根據(jù)不同的范圍與生成數(shù)量,我們需要選擇不同的策略:

-范圍小且需全覆蓋(如1~100):適合預生成后打亂順序。

-范圍大但數(shù)量少(如1~100000取10個):適合動態(tài)生成并去重。

-中等范圍動態(tài)生成(如1~1000取100個):適合逐步移除已選值。

 二、具體實現(xiàn)方法

方法1:使用`Collections.shuffle`打亂順序

適用場景:固定范圍內(nèi)生成所有值的不重復序列(如洗牌算法)。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ShuffleDemo {
    public static void main(String[] args) {
        int min = 1, max = 100;
        List<Integer> numbers = new ArrayList<>();
        for (int i = min; i <= max; i++) {
            numbers.add(i);
        }
        Collections.shuffle(numbers); // 關(guān)鍵:隨機打亂順序
        
        // 獲取前10個不重復值
        numbers.stream().limit(10).forEach(System.out::println);
    }
}

優(yōu)點:時間復雜度O(n),效率極高。  

缺點:需預先生成所有值,內(nèi)存占用高。

方法2:通過`Set`去重

適用場景:從大范圍中生成少量隨機數(shù)(如從1~100000中取10個)。

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class SetDemo {
    public static void main(String[] args) {
        int min = 1, max = 100_000, count = 10;
        Set<Integer> uniqueNumbers = new HashSet<>();
        Random random = new Random();

        while (uniqueNumbers.size() < count) {
            int num = random.nextInt(max - min + 1) + min;
            uniqueNumbers.add(num); // Set自動去重
        }

        uniqueNumbers.forEach(System.out::println);
    }
}

優(yōu)點:內(nèi)存占用低。  

缺點:生成數(shù)量接近范圍上限時性能驟降。

方法3:動態(tài)移除已選值

適用場景:中等范圍動態(tài)生成(如從1~1000中取500個)。

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class PoolDemo {
    public static void main(String[] args) {
        int min = 1, max = 1000, count = 10;
        List<Integer> pool = new ArrayList<>();
        for (int i = min; i <= max; i++) {
            pool.add(i);
        }

        Random random = new Random();
        for (int i = 0; i < count; i++) {
            int index = random.nextInt(pool.size());
            int num = pool.remove(index); // 移除已選值
            System.out.println(num);
        }
    }
}

優(yōu)點:避免重復碰撞問題。  

缺點:頻繁操作List可能導致性能下降。

方法4:Java 8 Stream API(簡潔寫法)

適用場景:快速生成少量不重復值。

import java.util.Random;
import java.util.stream.IntStream;

public class StreamDemo {
    public static void main(String[] args) {
        int min = 1, max = 100, count = 10;
        Random random = new Random();

        IntStream.generate(() -> random.nextInt(max - min + 1) + min)
                .distinct()     // 去重
                .limit(count)   // 限制數(shù)量
                .forEach(System.out::println);
    }
}

優(yōu)點:代碼簡潔,適合函數(shù)式編程。  

缺點:不適用于生成數(shù)量接近范圍上限的場景。

三、性能與注意事項

1. 范圍與數(shù)量的關(guān)系**:必須滿足 `count ≤ (max - min + 1)`,否則代碼會陷入死循環(huán)。

2. 線程安全:多線程環(huán)境下建議使用 `ThreadLocalRandom`。

3. 性能對比:

   - 最優(yōu)場景:`Collections.shuffle` > 動態(tài)移除 > Set > Stream

   - 最差場景:(如生成999/1000個值):動態(tài)移除 > `Collections.shuffle` > Set > Stream

四、總結(jié)

| 方法                | 適用場景                                            | 推薦指數(shù) |

| `Collections.shuffle`  | 小范圍全覆蓋                            | ????   |
| `Set`去重                   | 大范圍取少量值                        | ???     |
| 動態(tài)移除                   | 中等范圍動態(tài)取值                     | ????   |
| Stream API               | 代碼簡潔且數(shù)量遠小于范圍       | ??      |

建議根據(jù)實際需求選擇最合適的方法,避免因算法選擇不當導致性能問題。

到此這篇關(guān)于Java中生成不重復隨機數(shù)的四種方法的文章就介紹到這了,更多相關(guān)Java生成不重復隨機數(shù)方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis學習之路mysql批量新增數(shù)據(jù)的方法

    mybatis學習之路mysql批量新增數(shù)據(jù)的方法

    這篇文章主要介紹了mybatis學習之路mysql批量新增數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-02-02
  • MyBatisPlus使用@TableField注解處理默認填充時間的問題

    MyBatisPlus使用@TableField注解處理默認填充時間的問題

    這篇文章主要介紹了MyBatisPlus使用@TableField注解處理默認填充時間的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • springMVC之HandlerExceptionResolver使用

    springMVC之HandlerExceptionResolver使用

    這篇文章主要介紹了springMVC之HandlerExceptionResolver使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • springboot配置ldaps連接方式

    springboot配置ldaps連接方式

    這篇文章主要介紹了springboot配置ldaps連接方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java中5種方式實現(xiàn)String反轉(zhuǎn)

    Java中5種方式實現(xiàn)String反轉(zhuǎn)

    下面小編就為大家?guī)硪黄狫ava中5種方式實現(xiàn)String反轉(zhuǎn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。
    2016-06-06
  • Java實現(xiàn)批量操作Excel的示例詳解

    Java實現(xiàn)批量操作Excel的示例詳解

    在操作Excel的場景中,通常會有一些針對Excel的批量操作,以GcExcel為例,為大家詳細介紹一下Java是如何實現(xiàn)批量操作Excel的,需要的可以參考一下
    2023-07-07
  • Java查詢時間段(startTime--endTime)間的數(shù)據(jù)方式

    Java查詢時間段(startTime--endTime)間的數(shù)據(jù)方式

    這篇文章主要介紹了Java查詢時間段(startTime--endTime)間的數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot瘦身打包部署的實現(xiàn)

    SpringBoot瘦身打包部署的實現(xiàn)

    這篇文章主要介紹了SpringBoot瘦身打包部署的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • 淺談java7增強的try語句關(guān)閉資源

    淺談java7增強的try語句關(guān)閉資源

    下面小編就為大家?guī)硪黄獪\談java7增強的try語句關(guān)閉資源。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • spring boot starter actuator(健康監(jiān)控)配置和使用教程

    spring boot starter actuator(健康監(jiān)控)配置和使用教程

    這篇文章主要介紹了spring-boot-starter-actuator(健康監(jiān)控)配置和使用教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-06-06

最新評論