Java 如何从一个 List 中随机获得元素

概述

从一个 List 中随机获得一个元素是有关 List 的一个基本操作,但是这个操作又没有非常明显的实现。

本页面主要向你展示如何有效的从 List 中获得一个随机的元素和可以使用的一些方法。

选择一个随机的元素

为了从一个 List 中随机获得一个元素,你可以随机从 List 中获得一个索引的下标。

然后你可以使用这个随机的下标使用方法 List.get() 来随机获得元素。

使用这个方法的要点就是,随机生成的下标不要超过 List’s 的大小,否则你将会遇到溢出的异常。

单一随机元素

为了获得随机下标,你可以使用 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() 这个静态方法,然后将生成的随机数乘以 List 的大小。 (Math.random())将会生成 Double 的随机变量。

这个随机变量的区间在 0 和 1 之间,这个变量包含 0,但是不包含 1。

在完成上面的转换后,不要忘记需要将获得的下标转换为 int 类型。

在多线程环境中选择随机下标

在多线程环境中,如何使用单一的 Random 类实例,将会导致可能在这个实例中每一线程都访问到相同的结果。

我们可以使用 ThreadLocalRandom 类来为每一线程创建一个新的实例。

如下面的代码能够保证在多线程中不出现相同的随机下标。

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

可以重复选择元素

有时候,你可能希望从 List 中选择一些元素,但是这些选择的元素是可以重复的。

需要的操作也非常简单,需要多少就选多少,使用一个循环来做就可以了。

如下面的代码,直接使用循环。

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);
    }
}

选择不重复的元素

如果你希望你选择的元素是不重复的话,你可以在选择后将选择后的元素从 List 中移除。

需要注意的是担心下标的溢出。

例如你的 List 长度是 10, 但是你希望从这 List 中选择 11 个不重复的元素,这是没有办法做到的。

通常会抛出异常。

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);
    }
}

选择一个随机序列

这个方法的主要目的是将给出的 List 进行打乱,并且获得一个相同的随机序列。

当然你也可以使用循环来做,如果你使用 Collections 工具类能够更好的帮助你完成这个目标:

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);
}

结论

在本页面中,我们对 List 中的元素随机进行输出进行了一些探讨。

通过上面的内容,能够更好的帮助你了解有关 List 中的随机输出等情况。