La Web del Programador: Comunidad de Programadores
 
    Pregunta:  52329 - NUMEROS ALEATORIOS SIN REPETIR EN JAVA
Autor:  LUIS SEGOVIA TUCUCH.
Queria saber como podria generar numeros aleatorios dentro de un rango especifico(ej de:0-4), sin que se vuelva a repetir un numero que ya se haya generado anteriormente.

o como imprimir el contenido de un arreglo aleatoriamente, sin que se vuelva imprimir el contenido en la posicion que ya halla sido impresa antes. Ej;

supongamos que esto es un vector que contiene los numeros:1,2,1,2,3 y 0,1,2,3,4 son los indices o posiciones.

imprimir en contenido de la posicion 2; al imprimir va imprimir 1
imprimir en contenido de la posicion 0; al imprimir va imprimir 1
imprimir en contenido de la posicion 4; al imprimir va imprimir 3
imprimir en contenido de la posicion 3; al imprimir va imprimir 2
imprimir en contenido de la posicion 2; al imprimir va imprimir 1
imprimir en contenido de la posicion 2; al imprimir va imprimir 2.

de tal manera que la posicion que se valla a imprimir no se repita.
|1|0
|2|1
|1|2
|2|3
|3|4

Ruego ojala y me entiendan cualquiera de los dos casos que les pido me seria de mucha utilidad.

Gracias...

  Respuesta:  Hansen
Acabo de hacer este algoritmo.
Es bastante eficiente. Recibe por parámetro el "tope" de números y retorna un arreglo con los números desordenados (comenzando del 1)
En un principio el algoritmo creaba un arreglo de entero con los números ordenados como contenido de cada posición. Luego intercambiaba cada celda por otra aleatoria.

Lo hice un poco mas eficiente de forma que valla intercalando las celdas a medida que se van llenando con los números ordenados, de forma que recorra una sola vez el arreglo.
Espero que sirva
Saludos!

private int[] generarAleatorios(int l) {
int [] N = new int[l];
for(int I = 0; I<l;I++){
N[I]=I+1;
int T = N[I];
int A = Im.Aleatorio(I)-1;
N[I]= N[A];
N[A] = T;
}
return N;
}

  Respuesta:  Luis Segovia Tucuch
bueno yo creo ya logre enconttrar la solucion, pero si alguien lo puede hacer mas eficiente y optimo mejor.

public class BusquedaTest{
public static void main(String[]args){



Buscador bus = new Buscador( );

int ar[ ] = new int[5];

for(int f = 0; f<ar.length; f++){
ar[f] = -2;
}
// Generar numero aleatorion llamando al metodo generarAleatorio.

int aleat = bus.generarAleatorio( );

//Pasar como parametro el numero aleatorio antes generado y el vector
int comprobador = bus.buscar(ar, aleat);

/*Verificar si el numero antes generado, ya existe en el arreglo,
*si no existe en el arreglo insertarlo en caso de lo contrario
* generar otro numero aleatorio, hasta que se llene*/


while((ar[0]==-2) | (ar[1]==-2) | (ar[2]==-2) | (ar[3]==-2) | (ar[4]==-2) ){

if(comprobador == -1){
ar[bus.aumentarCont( )] = aleat;

aleat = bus.generarAleatorio( );
comprobador = bus.buscar(ar, aleat);

}else{
aleat = bus.generarAleatorio( );
comprobador = bus.buscar(ar, aleat);
}

}

for(int s=0; s<ar.length; s++){
System.out.println(ar[s]);
}


}
}

class Buscador{

int x =0;

public int buscar(int vector[], int dato){

int i;
int N = vector.length;
int pos = -1;

for(i=0; (i<N) && (pos == -1); i++)
if(vector[i] == dato)
pos = 1;


return pos;
}

public int aumentarCont( ){
return x++;
}

public int generarAleatorio( ){
return (0 + (int)(Math.random()*5));
}

}

tratare de hacerlo mas generico, por que esta enfocado mas como parte de un programas que estoy haciendo.