You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从ArrayList中随机抽取元素并移除,解决抽取结果不在列表内的问题

代码问题原因及修正方案

核心错误点

你的代码混淆了列表索引和列表存储的元素值:

  • rnd.nextInt(list1.size())生成的本身就是0到list1.size()-1范围内的合法索引,你直接用该值作为索引定位元素即可。但你现有的逻辑是把list1.get()返回的元素值当成了remove()操作的入参,当元素值大于当前list1的最大索引时,就会触发索引越界错误,也就是你遇到的“生成不存在数值”的问题。
  • 另外你提供的代码片段中没有初始化list1的1~50数值,也会导致空列表操作异常。

修正后代码

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

public class RandomDraw {
    public static void main(String[] args) {
        Random rnd = new Random();
        ArrayList<Integer> list1 = new ArrayList<>();
        ArrayList<Integer> list2 = new ArrayList<>();

        // 初始化list1,填充1到50的数值
        for (int i = 1; i <= 50; i++) {
            list1.add(i);
        }

        // 当原列表非空时持续抽取
        while (!list1.isEmpty()) {
            // 生成合法随机索引
            int randomIndex = rnd.nextInt(list1.size());
            // 按索引取抽取的元素
            int drawValue = list1.get(randomIndex);
            list2.add(drawValue);
            // 按索引删除原列表元素,不要传入元素值
            list1.remove(randomIndex);
        }

        // 验证输出
        System.out.println("随机抽取结果:" + list2);
    }
}

更简洁的实现方案

你要实现的“无放回随机抽取全量元素”等价于对列表做随机打乱,直接用JDK自带的Collections.shuffle()方法即可完成,无需手动实现循环抽取逻辑:

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

public class RandomDraw {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        for (int i = 1; i <= 50; i++) {
            list1.add(i);
        }
        // 随机打乱原列表
        Collections.shuffle(list1);
        // 打乱后的list1就是随机排序的抽取结果,可直接赋值给list2
        ArrayList<Integer> list2 = new ArrayList<>(list1);
    }
}

内容的提问来源于stack exchange,提问作者Roberto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:27:03