Llenar un array con números aleatorios

En esta entrada vamos a escribir un método Java que llene un array de enteros con números aleatorios.
Los números aleatorios deberán estar comprendidos entre dos límites (desde,  hasta) ambos incluidos.
El método recibe como parámetros los valores desde, hasta y el tamaño del array.
El método devuelve mediante return el array de enteros creado.
Para obtener números enteros aleatorios usaremos el método nextInt() de la clase Random.
Para que los números aleatorios obtenidos estén dentro de los limites utilizaremos el método nextInt() de la siguiente fórma: nextInt(hasta - desde + 1) + desde

public static int [] llenarArrayAleatorio(int desde, int hasta, int tam){
        int[] numeros = new int[tam];
        Random rnd = new Random();
        for (int i = 0; i < numeros.length; i++) {
            numeros[i] = rnd.nextInt(hasta - desde + 1) + desde;
        }
        return numeros;
}

Si los números no se pueden repetir debemos complicar un poco más el código.
En este caso cada vez que se obtiene un número aleatorio se debe comprobar si ya está en el array.
Para hacer este trabajo vamos a escribir un método llamado comprobarSiContiene. A este método se le envía el array, la posición del elemento actual y el número aleatorio a insertar y devuelve true si el número ya existe en el array. En ese caso se vuelve a sacar otro número aleatorio.

public static int[] llenarArrayAleatorio(int desde, int hasta, int tam) {
        int[] numeros = new int[tam];
        Random rnd = new Random();
        int n;
        for (int i = 0; i < numeros.length; i++) {
            do {
                n = rnd.nextInt(hasta - desde + 1) + desde;
            } while (comprobarSiContiene(numeros, i, n));
            numeros[i] = n;
        }
        return numeros;
}

public static boolean comprobarSiContiene(int[] numeros, int indice, int valor) {
        for (int i = 0; i < indice; i++) {
            if (numeros[i] == valor) {
                return true;
            }
        }
        return false;
}

Esta sería la solución para aquellos que están empezando a programar. Pero en este caso nos podemos ahorrar trabajo utilizando la API de Java. En concreto utilizando un ArrayList y el método shuffle de Collections.

La idea es llenar un ArrayList con todos los números comprendidos entre los límites desde/hasta. A continuación se llama al método shuffle para desordenarlos y después se pasan al array de enteros los tam primeros elementos, donde tam es el tamaño del array a devolver.

El método utilizando el ArrayList y Collections.shuffle quedaría así:

private static int[] llenarArrayAleatorio(int desde, int hasta, int tam) {
        ArrayList<Integer> array = new ArrayList<Integer>();
        for (int i = desde; i <= hasta; i++) {
            array.add(i);
        }
        Collections.shuffle(array);
        int [] numeros = new int[tam];
        for(int i = 0; i<numeros.length; i++){
            numeros[i]=array.get(i);
        }
        return numeros;
}

8 comentarios:

  1. gracias por sus aportes, no encontraba un codigo + explicacion de una fomra baica y entendible, sin tanto lenguaje tecnico

    ResponderEliminar
  2. gracias por compartir tu conocimiento

    ResponderEliminar
  3. y en una matriz seria con la misma temática o cambiaría ala hora de comparar ??? gracias por su atención

    ResponderEliminar
  4. en el metodo comprobarsicontiene que debe ir en int []numeros, indice y valor?

    ResponderEliminar
  5. Hola, necesito una Matriz N*N que genera valor al azar, que los valores no se repitan, que permita buscar un valor de la matriz que me indique la posición y que finalmente me organice la matriz en orden. Apenas estoy comenzando y no he podido dar con la solución.

    ResponderEliminar
  6. Esta grandioso!! me sirvió a la perfección!!
    Muchas gracias!

    ResponderEliminar
  7. GUAWWWW, gracias, ME HABEIS SALVADO LA VIDA!!!!!

    ResponderEliminar
  8. Me ha servido muchísimo!! Gracias por ponerlo de manera fácil y comprensible.
    CRACK

    ResponderEliminar