最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

摘要:

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

 一、需求場(chǎng)景分析

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

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

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

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

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

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

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

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)鍵:隨機(jī)打亂順序
        
        // 獲取前10個(gè)不重復(fù)值
        numbers.stream().limit(10).forEach(System.out::println);
    }
}

優(yōu)點(diǎn):時(shí)間復(fù)雜度O(n),效率極高。  

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

方法2:通過(guò)`Set`去重

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

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自動(dòng)去重
        }

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

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

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

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

適用場(chǎng)景:中等范圍動(dòng)態(tài)生成(如從1~1000中取500個(gè))。

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)點(diǎn):避免重復(fù)碰撞問(wèn)題。  

缺點(diǎn):頻繁操作List可能導(dǎo)致性能下降。

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

適用場(chǎng)景:快速生成少量不重復(fù)值。

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)點(diǎn):代碼簡(jiǎn)潔,適合函數(shù)式編程。  

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

三、性能與注意事項(xiàng)

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

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

3. 性能對(duì)比:

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

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

四、總結(jié)

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

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

建議根據(jù)實(shí)際需求選擇最合適的方法,避免因算法選擇不當(dāng)導(dǎo)致性能問(wèn)題。

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

相關(guān)文章

  • Java Hashtable機(jī)制深入了解

    Java Hashtable機(jī)制深入了解

    HashTable是jdk 1.0中引入的產(chǎn)物,基本上現(xiàn)在很少使用了,但是會(huì)在面試中經(jīng)常被問(wèn)到。本文就來(lái)帶大家一起深入了解一下Hashtable,需要的可以參考一下
    2022-09-09
  • Java任務(wù)調(diào)度的常見實(shí)現(xiàn)方法與比較詳解

    Java任務(wù)調(diào)度的常見實(shí)現(xiàn)方法與比較詳解

    這篇文章主要介紹了Java任務(wù)調(diào)度的常見實(shí)現(xiàn)方法與比較,結(jié)合實(shí)例形式分析了Java任務(wù)調(diào)度的四種常見實(shí)現(xiàn)方法,使用區(qū)別及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • Java中的BigDecimal使用問(wèn)題小結(jié)

    Java中的BigDecimal使用問(wèn)題小結(jié)

    BigDecimal 是 Java 中用于進(jìn)行精確十進(jìn)制計(jì)算的重要類, 它適用于金融、科學(xué)等需要高精度計(jì)算的場(chǎng)景,這篇文章讓我來(lái)詳細(xì)講解 Java 中的 BigDecimal 類,包括它的用途、適用場(chǎng)景、以及潛在問(wèn)題,感興趣的朋友一起看看吧
    2025-04-04
  • Mybatis如何使用正則模糊匹配多個(gè)數(shù)據(jù)

    Mybatis如何使用正則模糊匹配多個(gè)數(shù)據(jù)

    這篇文章主要介紹了Mybatis如何使用正則模糊匹配多個(gè)數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 最新評(píng)論

    库伦旗| 海淀区| 新沂市| 白城市| 荥阳市| 苍山县| 丹棱县| 高阳县| 固安县| 金昌市| 肇源县| 黎川县| 自治县| 南召县| 兴业县| 共和县| 东莞市| 大厂| 建始县| 堆龙德庆县| 汽车| 张家界市| 马山县| 江门市| 泰顺县| 宁阳县| 长泰县| 木兰县| 西丰县| 日喀则市| 峨山| 米林县| 阳东县| 常州市| 靖边县| 滕州市| 平武县| 新疆| 邢台县| 琼结县| 桦南县|