Java: genera un rango aleatorio de números específicos sin la duplicación de esos números. ¿Cómo?

Suena bastante simple … pero me he estado ocupando de esto, tratando de encontrar la solución definitiva.

Para un rango de números, digamos 1-12 , quiero generar una secuencia aleatoria dentro de ese rango, e incluir 1 y 12 .

Aunque no quiero números duplicados .

Así que me gustaría algo como esto: 3,1,8,6,5,4 … y así sucesivamente, cada número del 1 al 12.

Luego quiero poner estos números aleatorios en una Array y usar esa matriz para seleccionar y mostrar “aleatoriamente” algunos elementos (como el inventario extraído de la base de datos) en una página jsp.

El problema con lo que he intentado hasta ahora es que se generan muchos números duplicados … o no se eligen TODOS los números.

¿Hay una solución simple a este problema?


Editar

Prueba n. ° 1 con el método Collections y shuffle()

 ArrayList list = new ArrayList(10); for(int i = 0; i < 10; i++) { list.add(i); } Collections.shuffle(list); String[] randomNumbers = (String[])list.toArray(); for(int i = 0; i < 10; i++) { out.print(randomNumbers[i]+"
"); }

El resultado fue una secuencia con valores duplicados –
eligió = 3
eligió = 8
eligió = 7
eligió = 5
eligió = 1
eligió = 4
eligió = 6
eligió = 4
eligió = 7
eligió = 12

Test # 2 – usando la clase de matemática aleatoria

 int max = 12; int min = 1; int randomNumber = 0; String str_randomNumber = ""; for(int i=0; i<10; i++) { //int choice = 1 + Math.abs(rand.nextInt(11)); int choice = min + (int)(Math.random() * ((max - min) + 1)); out.print("chose = "+choice+"
"); }

El resultado fue como usar Collections.shuffle() .

Puede llenar una matriz con todos los valores del 1 al 12 y luego mezclarlos (consulte, por ejemplo, ¿Por qué Collections.shuffle () falla para mi matriz? )

Puede poner todos los números del 1 al 12 en orden en la matriz y luego usar algún algoritmo de mezcla para aleatorizar el orden de ellos, por ejemplo http://www.leepoint.net/notes-java/algorithms/random/random-shuffling.html .

La generación aleatoria de números permite duplicaciones. Si desea un rango de números aleatorios sin duplicación, le sugiero lo siguiente:

  1. Genere un número aleatorio (lo referiré a un númeroX).
  2. Agregar a un objeto Set.
  3. Comprueba el tamaño del objeto Set, si es el tamaño deseado, has terminado. Si es más pequeño que el tamaño deseado, vaya al paso 1

Si está utilizando MySQL o SQLLite como su base de datos, puede hacer esta aleatorización en el nivel de consulta SELECT usando ORDER BY RAND () para restringir a 1-12. Puede poner una cláusula where WHERE ID> = 1 AND ID <= 12 ORDER POR RAND ()

Podrías simplemente poner todos los números que deseas en una lista y luego ordenar la lista aleatoriamente y luego convertir la lista ordenada aleatoriamente a una matriz, por ej.

 List list = new ArrayList(); for (int i = 1; i <= 12; i++) { list.add(i); } Collections.sort(list, new Comparator() { @Override public int compare(Integer o1, Integer o2) { return Math.random() > 0.5 ? 1 : -1; } ); Integer[] array = list.toArray(new Integer[list.size()]);