Java – Get Random Item/Element From a List

https://www.baeldung.com/java-random-list-element

一、介绍
选择一个随机的List元素是一个非常基本的操作,但实现起来并不那么明显。在本文中,我们将展示在不同上下文中执行此操作的最有效方法。

  1. 挑选随机物品
    为了从List实例中获取随机项,您需要生成一个随机索引号,然后使用List.get()方法通过此生成的索引号获取项。

这里的关键点是要记住,您不能使用超过List大小的索引。

2.1. 单个随机项目
为了选择随机索引,您可以使用Random.nextInt(int bound)方法:

public void givenList_shouldReturnARandomElement() {
    List<Integer> givenList = Arrays.asList(1, 2, 3);
    Random rand = new Random();
    int randomElement = givenList.get(rand.nextInt(givenList.size()));
}

除了Random类,您始终可以使用静态方法Math.random()并将其与列表大小相乘(Math.random()生成介于 0(包含)和 1(不包含)之间的双随机值,因此请记住将其转换为int乘法后)。

2.2. 在多线程环境中选择随机索引
使用单个Random类实例编写多线程应用程序时,可能会导致为访问此实例的每个进程选择相同的值。我们总是可以通过使用专用的ThreadLocalRandom类为每个线程创建一个新实例:

int randomElementIndex
  = ThreadLocalRandom.current().nextInt(listSize) % givenList.size();

2.3. 选择重复的随机项目
有时您可能想从列表中选取几个元素。这很简单:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsRepeat() {
    Random rand = new Random();
    List<String> givenList = Arrays.asList("one", "two", "three", "four");

    int numberOfElements = 2;

    for (int i = 0; i < numberOfElements; i++) {
        int randomIndex = rand.nextInt(givenList.size());
        String randomElement = givenList.get(randomIndex);
    }
}

2.4. 选择不重复的随机项目
在这里,您需要确保选择后从列表中删除元素:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsNoRepeat() {
    Random rand = new Random();
    List<String> givenList = Lists.newArrayList("one", "two", "three", "four");

    int numberOfElements = 2;

    for (int i = 0; i < numberOfElements; i++) {
        int randomIndex = rand.nextInt(givenList.size());
        String randomElement = givenList.get(randomIndex);
        givenList.remove(randomIndex);
    }
}

2.5. 选择随机系列
如果您想获得随机系列的元素,Collections utils 类可能会很方便:

public void givenList_whenSeriesLengthChosen_shouldReturnRandomSeries() {
    List<Integer> givenList = Lists.newArrayList(1, 2, 3, 4, 5, 6);
    Collections.shuffle(givenList);

    int randomSeriesLength = 3;

    List<Integer> randomSeries = givenList.subList(0, randomSeriesLength);
}

三、结论
在这篇文章中,我们探索取出由随机因素的最有效的方式列出instanc Ë于不同的场合。

作者:Jeebiz  创建时间:2022-01-05 16:29
 更新时间:2023-12-22 21:09