domingo, 13 de mayo de 2012

Generar números aleatorios sin repetirse en java (usando Math.random)





Saludos a todos,

Este problema me llega a causa de otro problema que estoy solucionando y que posteriormente publicare aquí.

Se trata de generar números aleatorios en java dado un numero inicial y uno final pero con la condición de no repetirse; por ejemplo

numero inicial = 3
numero final = 7

La salida puede ser algo así [6,7,4,5,3]

La forma particular en que lo resuelvo es ir llenando una lista con los numero que voy generando y para así tener una referencia y no repetirlos.

Antes de empezar con el algoritmo tengo que tener en cuenta cuantos numeros como maximo debo generar asi seria (numeroInicial - numeroFinal) + 1; usando el ejemplo anterior quedaría que la máxima cantidad de numero que generare sera (7 - 3) + 1 = 5

El algoritmo para generar un sera así:

1. Si el tamaño de la lista es menor que ((numeroInicial - numeroFinal) + 1) sigo al paso 2, sino al paso 3.

2. Genero un numero aleatorio establecido dentro del rango y sigo al paso 3.

3. Si la lista esta vacía sigo al paso 4 sino al paso 5

4. Adjunto el numero a la lista y sigo al paso 6.

5 Como no esta vacía la lista verifico, si el numero generado esta en la lista regreso al paso 1, sino regreso al paso 4

6. Muestro el numero generado, sigo al paso 7.

7. Fin


Hosting

Codigo:

//Por Rey Salcedo
import java.util.ArrayList;
public class NumeroAleatorios {
  private int valorInicial;
  private int valorFinal;
  private ArrayList listaNumero;

  public NumeroAleatorios(int valorInicial, int valorFinal){
    this.valorInicial = valorInicial;
    this.valorFinal = valorFinal;
    listaNumero = new ArrayList();
  }
    
  private int numeroAleatorio(){
    return (int)(Math.random()*(valorFinal-valorInicial+1)+valorInicial);
  }
    
  public int generar(){
   if(listaNumero.size() < (valorFinal - valorInicial) +1){
   //Aun no se han generado todos los numeros
      int numero = numeroAleatorio();//genero un numero
      if(listaNumero.isEmpty()){//si la lista esta vacia
        listaNumero.add(numero);
        return numero;
      }else{//si no esta vacia
        if(listaNumero.contains(numero)){//Si el numero que generé esta contenido en la lista
          return generar();//recursivamente lo mando a generar otra vez
        }else{//Si no esta contenido en la lista
          listaNumero.add(numero);
          return numero;
        }
      }
   }else{// ya se generaron todos los numeros
     return -1;
   }
  }
}




public class Ejemplo{
 public static void main(String[] args){
 //Generando números aleatorios del 3 al 7 sin repetirse
  NumeroAleatorios na = new NumeroAleatorios(3,7);   
  for(int i = 0; i < 5;i++){
    System.out.print(na.generar()+",");
  }
 }
}

Nota: si forzar a generar mas numero de los que debería generar te retornara un -1, que te indicará que ya se generaron todos los números posibles.  

Clic aquí para descargar código Ejemplo.java.

Clic aquí para descargar código NumeroAleatorios.java.

Como siempre, espero les guste y les sirva; comenten cualquier duda o sugerencia.



Entrada destacada

Matriz de adyacencia para un grafo

"La matriz de adyacencia es una matriz cuadrada que se utiliza como una forma de representar relaciones binarias."; aunque pa...