Java - Obtener elemento / elemento aleatorio de una lista

1. Introducción

Elegir un elemento List aleatorio es una operación muy básica pero no tan obvia de implementar. En este artículo, mostraremos la forma más eficiente de hacer esto en diferentes contextos.

2. Elegir un artículo o artículos al azar

Para obtener un elemento aleatorio de una instancia de List , debe generar un número de índice aleatorio y luego buscar un elemento por este número de índice generado usando el método List.get () .

El punto clave aquí es recordar que no debe usar un índice que exceda el tamaño de su Lista .

2.1. Elemento aleatorio único

Para seleccionar un índice aleatorio, puede usar el método Random.nextInt (int bound) :

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

En lugar de la clase Random , siempre puede usar el método estático Math.random () y multiplicarlo por el tamaño de la lista ( Math.random () genera un valor aleatorio doble entre 0 (incluido) y 1 (exclusivo), así que recuerde convertirlo en int después de la multiplicación).

2.2. Seleccionar índice aleatorio en entorno multiproceso

Al escribir aplicaciones multiproceso utilizando la instancia de clase aleatoria única , puede resultar en elegir el mismo valor para todos los procesos que acceden a esta instancia. Siempre podemos crear una nueva instancia por hilo usando una clase ThreadLocalRandom dedicada :

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

2.3. Seleccionar elementos aleatorios con repeticiones

A veces, es posible que desee seleccionar algunos elementos de una lista. Es bastante sencillo:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsRepeat() { Random rand = new Random(); List 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. Seleccionar elementos aleatorios sin repeticiones

Aquí, debe asegurarse de que el elemento se elimine de la lista después de la selección:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsNoRepeat() { Random rand = new Random(); List 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. Seleccionar serie aleatoria

En caso de que desee obtener una serie aleatoria de elementos, la clase de utilidades de Colecciones puede ser útil:

public void givenList_whenSeriesLengthChosen_shouldReturnRandomSeries() { List givenList = Lists.newArrayList(1, 2, 3, 4, 5, 6); Collections.shuffle(givenList); int randomSeriesLength = 3; List randomSeries = givenList.subList(0, randomSeriesLength); }

3. Conclusión

En este artículo, hemos explorado la forma más eficiente de ir a buscar los elementos al azar de una lista instanc correo para diferentes escenarios .

Se pueden encontrar ejemplos de código en GitHub.