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 <desde, hasta> utilizaremos el método nextInt() de la siguiente forma:
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<>();                                                         
        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;                                                                                           
}

18 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
  9. Tam contiene el tamaño del array y normalmente se pedirá por teclado y se envía al método

    ResponderEliminar
  10. Y cómo se haría el método main? no consigo recuperar los datos de "numeros". Gracias

    ResponderEliminar
    Respuestas
    1. En el main llamamos al método de esta forma:

      int [] arrayNumeros = llenarArrayAleatorio(desde, hasta, tamaño);

      a las variables desde y hasta se les habrá asignar antes los valores correspondientes y la variable tamaño contendrá el tamaño del array a crear. También podemos poner en la llamada al método directamente estos valores sin utilizar variables.
      Despues recorremos arrayNumeros, por ejemplo con un for, para acceder a su contenido.

      Eliminar
  11. De acuerdo, mucha gracias Enrique, estoy haciendo todos tu ejercicios y me están ayudando mucho a aprender.
    Copio y pego el código del método main por a alguien le sirve de ayuda.

    public static void main(String[] args) {
    Scanner sc= new Scanner(System.in);

    int desde, hasta;
    int tam;
    int i;



    System.out.print("Desdel el número = ");
    desde=sc.nextInt();
    System.out.print("Hasta el número = ");
    hasta=sc.nextInt();
    tam=hasta-desde;



    for(i=0; i<tam; i++) {
    int [] arrayNumeros = llenarArrayAleatorio(desde, hasta, tam);
    System.out.print(arrayNumeros[i] + ", ");
    }

    System.out.print(".");
    }

    ResponderEliminar
    Respuestas
    1. rectifico la la siguiente linea:
      tam=hasta-desde+1; //faltaba añadir +1 para que incluyo ambos números, del "desde" al "hasta".

      Eliminar
    2. Me alegro de que los ejercicios te estén siendo útiles. Gracias por el comentario, tan solo una aclaración: la variable tam indica el tamaño del array y es independiente de los números aleatorios. Podemos tener por ejemplo un array de 10 elementos con números aleatorios desde 4 hasta 50.

      Eliminar
    3. Esta parte nt [] arrayNumeros = llenarArrayAleatorio(desde, hasta, tam); va antes del for, el for solo se utiliza para recorrer el array que ya esta lleno

      int [] arrayNumeros = llenarArrayAleatorio(desde, hasta, tam);

      for(i=0; i<tam; i++) {

      System.out.print(arrayNumeros[i] + ", ");
      }

      Eliminar
  12. Hola buenas tardes

    Me podrían apoyar

    Necesito un programa que simule un token bancario

    Me pueden apoyar por favor con esto

    Gracias por su atención

    ResponderEliminar
  13. ayudarme, Escribir un programa que llene un arreglo con los números enteros comprendidos entre 4
    y 14 y mostrar el contenido del arreglo?

    ResponderEliminar