Rellenar un array de números aleatorios sin repetir en Java

Hola a todos, hoy os voy a explicar como podemos rellenar un array de números aleatorios sin repetir en Java.

Es posible que cuando generamos un array de números aleatorios en Java, necesitemos que esos números no se repitan, por ejemplo, un boleto de lotería.

Preparando todo para generar números aleatorios sin repetir

Para generar un array de números aleatorios necesitaremos pedir al usuario, lo siguiente:

  • Longitud del array.
  • Minimo valor.
  • Maximo valor.

También necesitamos generar un número aleatorio, lo tenemos en este tutorial:

Como generar números aleatorios con el método Math.random de Java

package es.discoduroderoer.app;

import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {
        
        Scanner sn = new Scanner(System.in);
        
        System.out.println("Escribe la longitud del array");
        int longitud = sn.nextInt();
        
        System.out.println("Escribe el valor minimo");
        int minimo = sn.nextInt();
        
        System.out.println("Escribe el valor máximo");
        int maximo = sn.nextInt();
        
    }
    
    public static int generaNumeroAleatorio(int minimo, int maximo) {
        return (int) (Math.random() * (minimo - (maximo + 1)) + (maximo + 1));
    }
    
}

Validaciones

Con todo lo necesario ya podemos empezar, debemos tener algunas cosas en cuenta con los valores dados:

  • La longitud debe ser mayor de 0.
  • Si el numero mínimo es mayor que el máximo, lo intercambiaremos para evitar problemas.
  • La diferencia entre el mínimo y máximo debe ser mayor a la longitud.
package es.discoduroderoer.app;

import java.util.Arrays;
import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {
        
        Scanner sn = new Scanner(System.in);
        
        System.out.println("Escribe la longitud del array");
        int longitud = sn.nextInt();
        
        System.out.println("Escribe el valor minimo");
        int minimo = sn.nextInt();
        
        System.out.println("Escribe el valor máximo");
        int maximo = sn.nextInt();
        
        if (longitud > 0) {
           
            if (maximo < minimo) {
                int aux = minimo;
                minimo = maximo;
                maximo = aux;
            }

            if ((maximo - minimo) >= (longitud - 1)) {

            }else{
                System.out.println("No se puede generar un array con ese rango");
            }
        }else{
            System.out.println("La longitud no es correcta");
        }
        
        
        
    }
    
    public static int generaNumeroAleatorio(int minimo, int maximo) {
        return (int) (Math.random() * (minimo - (maximo + 1)) + (maximo + 1));
    }
    
}

Si todo esta correcto, podemos empezar con el algoritmo.

Algoritmo para generar números aleatorios sin repetir

Crearemos un array con la longitud dada y lo rellenamos con un valor que no este entre mínimo y el máximo, puede ser el valor menor menos 1 o el valor máximo mas 1.

Después, recorreremos el array validando por cada posición si ya esta en el array, por lo que si esta repetido, volveremos a generar un nuevo numero. Solo cuando el número lo insertemos continuaremos rellenando nuestro array.

package es.discoduroderoer.app;

import java.util.Arrays;
import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {
        
        Scanner sn = new Scanner(System.in);
        
        System.out.println("Escribe la longitud del array");
        int longitud = sn.nextInt();
        
        System.out.println("Escribe el valor minimo");
        int minimo = sn.nextInt();
        
        System.out.println("Escribe el valor máximo");
        int maximo = sn.nextInt();
        
        if (longitud > 0) {
           
            if (maximo < minimo) {
                int aux = minimo;
                minimo = maximo;
                maximo = aux;
            }

            if ((maximo - minimo) >= (longitud - 1)) {

                int numeros[] = new int[longitud];
                Arrays.fill(numeros, minimo - 1);
                int i = 0;
                int num = 0;
                while (i < numeros.length) {

                    boolean repetido;
                    do {
                        repetido = false;
                        num = generaNumeroAleatorio(minimo, maximo);

                        for (int j = 0; j < numeros.length && !repetido; j++) {
                            if (numeros[j] == num) {
                                repetido = true;
                            }
                        }
                    } while (repetido);

                    numeros[i] = num;
                    i++;
                }
                
                System.out.println("Numeros generados");
                for (int j = 0; j < numeros.length; j++) {
                    System.out.println(numeros[j]);
                }

            }else{
                System.out.println("No se puede generar un array con ese rango");
            }
        }else{
            System.out.println("La longitud no es correcta");
        }
        
    }
    
    public static int generaNumeroAleatorio(int minimo, int maximo) {
        return (int) (Math.random() * (minimo - (maximo + 1)) + (maximo + 1));
    }
    
}

Ejecutando nuestro programa

Con todo listo, podemos ya probar nuestro programa.

Probaremos los siguientes valores:

  • Longitud: 10
  • Valor minimo: 0
  • Valor máximo: 20

array de números aleatorios sin repetir java 1

Podemos probar ver qué pasa si ponemos la longitud incorrecta.

array de números aleatorios sin repetir java 2

Otro caso puede ser que no podamos rellenar el array:

  • Longitud: 10
  • Valor minimo: 0
  • Valor maximo: 5

array de números aleatorios sin repetir java 3

Función para generar números aleatorios sin repetir

Todo esto que hemos hecho, seria interesante poder ejecutarlo cuando lo necesitemos con una función.

package es.discoduroderoer.app;

import java.util.Arrays;
import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {
        
        Scanner sn = new Scanner(System.in);
        
        System.out.println("Escribe la longitud del array");
        int longitud = sn.nextInt();
        
        System.out.println("Escribe el valor minimo");
        int minimo = sn.nextInt();
        
        System.out.println("Escribe el valor máximo");
        int maximo = sn.nextInt();
        
        int[] numeros = generaNumeroAleatoriosNoRepetidos(longitud, minimo, maximo);
        
        if(numeros != null){
            for (int i = 0; i < numeros.length; i++) {
                System.out.println(numeros[i]);
            }
        }else{
            System.out.println("Los valores son incorrectos");
        }
        
    }
    
    public static int[] generaNumeroAleatoriosNoRepetidos(int longitud, int minimo, int maximo) {

        if (longitud < 0) {
            return null;
        } else {

            if (maximo < minimo) {
                int aux = minimo;
                minimo = maximo;
                maximo = aux;
            }

            if ((maximo - minimo) >= (longitud - 1)) {

                int numeros[] = new int[longitud];
                Arrays.fill(numeros, minimo - 1);
                int i = 0;
                int num = 0;
                while (i < numeros.length) {

                    boolean repetido;
                    do {
                        repetido = false;
                        num = generaNumeroAleatorio(minimo, maximo);

                        for (int j = 0; j < numeros.length && !repetido; j++) {
                            if (numeros[j] == num) {
                                repetido = true;
                            }
                        }
                    } while (repetido);

                    numeros[i] = num;
                    i++;
                }

                return numeros;
            } else {
                return null;
            }
        }

    }
    
    public static int generaNumeroAleatorio(int minimo, int maximo) {
        return (int) (Math.random() * (minimo - (maximo + 1)) + (maximo + 1));
    }
    
}

Recuerda que tenemos un video haciendo esto mismo paso a paso:

Este código también esta en nuestra biblioteca de Java.

https://github.com/DiscoDurodeRoer/Biblioteca-DDR-Java

Espero que os sea de ayuda, si tenéis dudas, preguntad. Estamos para ayudarte.

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *