Suena bastante simple…pero he sido perseverando en esto, tratando de encontrar el uno y a todos.

Para un rango de números, por ejemplo 1-12, quiero generar una secuencia aleatoria dentro de ese rango, y include 1 y 12.

no quiero duplicar números.

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

Entonces quiero poner estos números aleatorios en un Array y el uso de la matriz a ‘al azar’ seleccionar y mostrar algunos elementos (como el inventario sacó de la base de datos) en una página jsp.

El problema con lo que he probado hasta ahora, es que hay un montón de duplicar números generados…o, no de TODOS de los números escogidos.

Hay una solución simple a este problema?


Editar

Prueba#1 usar Collections y shuffle() método –

ArrayList<Integer> list = new ArrayList<Integer>(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]+"<br>");
}

El resultado fue una serie con valores duplicados –

eligió = 3

eligió = 8

eligió = 7

eligió = 5

eligió = 1

eligió = 4

eligió = 6

eligió = 4

eligió = 7

eligió = 12

Prueba #2 – mediante un sistema Aleatorio de la clase de matemáticas

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+"<br>");
}

El resultado fue justo como la utilización de Collections.shuffle().

  • dado que el rango es de 1 a 12, se puede esperar un par de duplicados. la atención que nos muestran cómo aleatorizar ellos?
  • editado el post para añadir la parte del código que he probado
  • como les dije 1-12 es muy pequeño y no se duplica en absoluto. lo que puedes hacer es comprobar si el siguiente número aleatorio ya se generó y si es así, descartar y se procede a generar de nuevo hasta que esté todo hecho.
  • La versión de Prueba#1 funciona bien para mí (después de intercambiar String[] por Objeto [de]) y no el rendimiento de los duplicados.
  • Yo hice el mismo cambio como usted, en sustitución de String[] con el Objeto de[], y que es en el que funcionaba correctamente, sin duplicados. Gracias por traer esto a mi atención.
  • me alegro de que podría ayudarle.
  • Este ha sido preguntado muchas veces antes: por ejemplo, stackoverflow.com/questions/196017/unique-random-numbers-in-o1 stackoverflow.com/questions/3395911/…
  • Su prueba #1 habría tenido que lanzar una excepción cuando se ejecuta. De alguna manera que se ingiere y la que terminó con la mirada fija en edad de salida. Se que esto ejecuta dentro de algún tipo de aplicación web (me doy cuenta de la «<br>»?) Que iba a ser mucho mejor que solo se ejecutan directamente desde la línea de comandos.

InformationsquelleAutor katura | 2011-03-07

6 Comentarios

  1. 3

    Usted puede llenar un array con todos los valores de 1 a 12 y, a continuación, shuffle (ver, por ejemplo,¿Por qué las Colecciones.shuffle() no para mi matriz?)

    • He probado ese método también…voy a anexar una prueba fragmento de código a mi post ahora.
    • Cambiando de Cadena[] para Ojbect[] en mi prueba fragmento dado los resultados que yo quería.
    • cualquier razón detrás de ella?
  2. 0

    La generación de números aleatorios permite duplicaciones. Si quieres un rango de números aleatorios sin repetición, sugiero el siguiente:

    1. Generar un número aleatorio (me referiré a este un numberX).
    2. Agregar a un Conjunto de objetos.
    3. Comprobar el tamaño del Conjunto de objetos, si es que el tamaño deseado, se hace. Si es más pequeña que el tamaño deseado, vaya al paso 1
    • Esto sería útil si quería menos de n números en el intervalo [m, m+n). Por supuesto, el uso de una orden de preservación de establecer como LinkedHashSet.
  3. 0

    Si usted está usando MySQL o SQLLite como su base de datos usted puede hacer esto de la aleatorización en el SELECCIONE el nivel de consulta con ORDER by RAND() para restringir a 1-12 usted puede poner una cláusula where where ID >=1 Y ID <=12 ORDER BY RAND()

    • Interesante…algo que nunca has intentado antes, gracias por publicarlo.
  4. 0

    Este es un método de utilidad para la creación de un número Entero aleatorio :

    public static int randomInteger(int min, int max) {
        Random rd = new Random();
        return rd.nextInt((max - min) + 1) + min;
    }

    Este es un algoritmo que produce siempre un único Conjunto de números enteros:

    public static Set<Integer> makeRandomSet(int howManyNumber, int startNumber, int endNumber){
        Set<Integer> integerSet = new HashSet<>();
    
        boolean couldBeAdded = false;
        for(int i=0; i< howManyNumber; i++) {
            while (!couldBeAdded) {
                Integer randomInt = randomInteger(startNumber, endNumber);
                couldBeAdded = integerSet.add(randomInt);
            }
    
            couldBeAdded = false;
        }
    
        return integerSet;
    }

    Hemos hecho uso de método add tipo de retorno para comprobar el valor duplicado dentro de nuestro Conjunto.

    Y aquí está el código de la prueba:

    public static void main(String[] args) {
        Set<Integer> randomSet = makeRandomSet(6, 1, 54);
        System.out.println(randomSet);
    }

    La salida del código anterior es 6 aleatorios enteros únicos número de
    entre 1 y 54

  5. -1

    Usted puede simplemente poner todos los números que desee en la Lista y, a continuación, ordenar la Lista de forma aleatoria y, a continuación, convertir la lista ordenada al azar a una matriz, por ejemplo,

    List<Integer> list = new ArrayList<Integer>();
    
    for (int i = 1; i <= 12; i++) {
        list.add(i);
    }
    
    Collections.sort(list, new Comparator<Integer>() {
    
        @Override
        public int compare(Integer o1, Integer o2) {
              return Math.random() > 0.5 ? 1 : -1;
        }
    );
    Integer[] array = list.toArray(new Integer[list.size()]);
    • La creación de una fractura de un comparador es una idea realmente mala e innecesaria; sólo el uso de las bibliotecas que son la intención de para este (Colecciones.shuffle()).
    • bourrillion ¿por qué? puede usted proporcionar las razones con sus fuentes, por favor?
    • Realmente no es obvio que es mejor llamar a sólo shuffle en lugar de escribir todo ese código?

Dejar respuesta

Please enter your comment!
Please enter your name here