martes, 21 de enero de 2014

Generar números aleatorios sin repetir con Java

¿Alguna vez os ha surgido la necesidad de generar números aleatorios sin que los mismos se repitan? Aquí os dejo una posible solución, codificado en Java:


public class NoRepeatRandom {

    private int[] numeros = null;
    private int N = -1;
    private int numRestantes = 0;
    
    public NoRepeatRandom(int minVal, int maxVal){
        N = (maxVal - minVal) + 1;
        numeros = new int[N];
        int n = minVal;
        for(int i = 0; i < N; i++)
          numeros[i] = n++;
        numRestantes = N;
    }

    public int getRandom(){
        // Devuelve -1 cuando no quedan números
        if(numRestantes <= 0) return -1;

        // Si no, calculamos un índice aleatorio
        int index = (int) (numRestantes * Math.random());
        int randNum = numeros[index];

        // Desplazamos el valor obtenido al final del array, y 
        // disminuimos el numero de elementos restantes:
        numeros[index] = numeros[size-1];
        numeros[--numRestantes] = randNum;

        // Devolvemos el número aleatorio
        return randNum;
    }
}

Para hacer uso de esta clase, deberemos crear un nuevo objeto de la siguiente forma:


public class Principal {
  
  public static void main(String[] args) {
    
    // El objeto random generará números aleatorios en el intervalo [1-1000]
    NoRepeatRandom random = new NoRepeatRandom(1, 1000);
    
    // El valor devuelto lo almacenamos en una variable tipo int:
    int num = random.getRandom();
    
    ....
  
  }
} 

1 comentario:

  1. La variable size usado en el primero método en la línea 26 no esta inicializado, ni declarado, cuando debe valer?

    ResponderEliminar