从数组中随机抽取几个不重复的元素的几种实现方式(Java语言)

本文介绍了四种在Java中从数组中随机抽取不重复元素的方法,包括使用Set自动去重、生成随机索引数组、洗牌后再抽取和逐次删除元素再抽取

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从数组中随机抽取几个不重复的元素的几种实现方式(Java语言)

需要从数组中随机抽取几个不重复的元素。

一、利用集合Set自动剔除选取的重复元素

来源:https://blog.51cto.com/u_16175449/7395618

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

public class RandomArrayElement {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        Random random = new Random();
        int count = random.nextInt(array.length);	//抽取的个数也是随机的
        Set<Integer> set = new HashSet<>();			//集合,自动排重
        while (set.size() < count) {
            int index = random.nextInt(array.length);	// 随机生成一个[0-array.length)的整数
            set.add(array[index]);
        }
        System.out.println("抽取到的元素:");
        for (int element : set) {
            System.out.println(element);
        }
    }
}

二、利用Random生成一个索引数组,遍历索引数组取得目标数组中的元素

来源:https://blog.51cto.com/u_16213341/7256808

import java.util.Random;

public class RandomArray {
    public static void main(String[] args) {
        String[] students = {"Alice", "Bob", "Charlie", "David", "Emma", "Frank", "Grace"};

        int numToSelect = 3; // 指定要抽取的学生人数

        String[] selectedStudents = selectRandomStudents(students, numToSelect);

        System.out.println("Selected students:");
        for (String student : selectedStudents) {
            System.out.println(student);
        }
    }

    public static String[] selectRandomStudents(String[] students, int numToSelect) {
        Random random = new Random();
        //核心代码
        int[] indexes = random.ints(0, students.length).distinct().limit(numToSelect).toArray();

        String[] selectedStudents = new String[numToSelect];
        for (int i = 0; i < numToSelect; i++) {
            selectedStudents[i] = students[indexes[i]];
        }
        return selectedStudents;
    }
}

三、利用Collections.shuffle()洗牌,然后抽取几个想要的元素

来源:https://blog.51cto.com/u_16175455/6770730

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

public class RandomArrayElement {
    public static void main(String[] args) {
        String[] names = {"Alice", "Bob", "Charlie", "David", "Emily", "Frank"};
        int numToSelect = 3; // 需要抽取的元素个数
        
        List<String> nameList = new ArrayList<>(Arrays.asList(names));
        Collections.shuffle(nameList); // 将名字列表随机排序【核心代码】
        
        List<String> selectedNames = new ArrayList<>();
        for (int i = 0; i < numToSelect; i++) {
            String selectedName = nameList.get(i); // 获取随机元素
            selectedNames.add(selectedName); // 将元素添加到已选列表
            nameList.remove(selectedName); // 从名字列表中移除已选元素
        }
        
        System.out.println("随机选取的名字是:" + selectedNames);
    }
}

四、每次随机选一个数,然后删除该元素后继续抽取

来源:https://blog.51cto.com/u_16175499/7648566

import java.util.Arrays;
import java.util.Random;

public class RandomSample {

    public static void main(String[] args) {
        String[] array = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"};

        int n = 5; // 需要抽取的元素个数

        String[] result = new String[n];
        Random random = new Random();

        for (int i = 0; i < n; i++) {
            int index = random.nextInt(array.length); // 生成随机索引
            result[i] = array[index]; // 添加到新数组中
            array = removeElement(array, index); // 删除原数组中的元素
        }

        System.out.println(Arrays.toString(result));

<think>好的,用户想在数组实现随机抽取元素的功能,需要指导如何在各种编程语言实现。首先,我得回忆一下语言随机函数用法。比如Python用random模块,Java用Random类,PHP有array_rand,MATLAB有randperm和randi,Swift也有自己的方法。 用户提供的引用里提到了Swift、PHP、MATLAB和Java的例子,所以可能需要覆盖这些语言。另外,用户可能需要重复或允许重复的情况,引用3提到MATLAB中有两种情况,所以应该区分这两种情况。 需要先总结每种语言的常用方法,比如Python的random.sample和random.choices,Java的Random.nextInt,PHP的array_rand,MATLAB的randperm和randi,Swift的randomElement和shuffled。然后分别给出代码示例,说明如何选择单个或多个元素,是否允许重复。 还要注意代码的正确性,比如Python中random.sample用于重复,random.choices允许重复,并指定k参数。Java中生成随机索引时,nextInt的范围是数组长度,多次选取时可能需要处理重复,比如使用随机数流或者集合去重。 另外,引用中提到Swift的样例,可能需要使用randomElement()方法,或者用shuffled取前几个元素。PHP的array_rand返回的是键,需要根据键取对应的值。 还要注意语言数组的索引方式,比如PHP的关联数组可能需要处理键的情况,但用户的问题可能更多是索引数组。MATLAB中随机数的生成方式,randperm用于重复,randi允许重复。 需要确保每个示例都符合各语言的语法,并且正确实现功能。同时,要提醒用户初始化随机数生成器的重要性,比如Java要每次生成新的Random实例,以免得到相同的随机序列。 最后,生成相关问题,可能涉及性能优化、应用场景、语言比较,或者如何确保随机性等。参考用户之前的示例问题,可以提出如何避免重复、如何加权随机选择、同方法的效率比较等。</think>### 在数组随机选择元素实现方法 在编程中,从数组随机抽取一个或多个元素是常见需求。以下是语言的具体实现方法,分为 **重复抽取** 和 **允许重复抽取** 两类,并附代码示例。 --- #### 一、Python 1. **重复抽取** 使用 `random.sample()` 函数,从数组随机选取 `k` 个唯一元素: ```python import random arr = [2, 5, 8, 10, 15] # 抽取2个重复元素 selected = random.sample(arr, k=2) ``` 2. **允许重复抽取** 使用 `random.choices()` 函数,通过参数 `k` 指定抽取数量: ```python selected = random.choices(arr, k=3) # 可能包含重复元素 ``` --- #### 二、Java 1. **重复抽取** 通过 `Random` 类生成随机索引,确保索引重复: ```java import java.util.Random; int[] arr = {2, 5, 8, 10, 15}; Random rand = new Random(); // 抽取2个重复元素 int index1 = rand.nextInt(arr.length); int index2 = rand.nextInt(arr.length); while (index2 == index1) { index2 = rand.nextInt(arr.length); } int[] selected = {arr[index1], arr[index2]}; ``` 2. **允许重复抽取** 直接生成随机索引,检查重复性: ```java int[] selected = new int[3]; for (int i = 0; i < 3; i++) { selected[i] = arr[rand.nextInt(arr.length)]; } ``` --- #### 三、PHP 1. **重复抽取** 使用 `array_rand()` 函数返回随机键名: ```php $arr = [2, 5, 8, 10, 15]; $keys = array_rand($arr, 2); // 返回两个键名 $selected = [$arr[$keys[0]], $arr[$keys[1]]]; ``` 2. **允许重复抽取** 多次调用 `array_rand()`: ```php $selected = []; for ($i = 0; $i < 3; $i++) { $key = array_rand($arr); $selected[] = $arr[$key]; } ``` --- #### 四、MATLAB 1. **重复抽取** 使用 `randperm` 生成随机排列索引: ```matlab A = [20, 5, 80, 150, 130, 260]; n = 3; indices = randperm(numel(A), n); % 生成重复索引 random_num = A(indices); ``` 2. **允许重复抽取** 使用 `randi` 生成允许重复的索引: ```matlab indices = randi(numel(A), 1, n); % 允许重复 random_num = A(indices); ``` --- #### 五、Swift 1. **重复抽取** 使用 `shuffled()` 打乱数组后取前 `k` 个元素: ```swift let arr = [2, 5, 8, 10, 15] let selected = Array(arr.shuffled().prefix(2)) // 抽取2个重复元素 ``` 2. **允许重复抽取** 多次调用 `randomElement()` 方法: ```swift var selected: [Int] = [] for _ in 0..<3 { if let element = arr.randomElement() { selected.append(element) } } ``` --- ### 关键注意事项 1. **随机数种子**:在需要可重复性的场景(如测试),需固定随机数种子[^4]。 2. **效率优化**:若频繁抽取,避免重复初始化随机数生成器(如Java中 `Random` 实例化一次即可)。 3. **数组越界**:确保索引值在数组长度范围内。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐骁虎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值