desglose del un método generar numero aleatorio sin que se repita JAVA

Iniciado por elm0n0, 24 Abril 2015, 16:52 PM

0 Miembros y 1 Visitante están viendo este tema.

elm0n0

estoy intentando comprender por que este código me da un numero aleatorio sin repetirse y por mas vueltas que le doy no consigo comprenderlo.

Lo he intentado pasar a un papel siguiendo el bucle pero en el papel me ocurre que si que se pierde algún numero mientras que ejecutandolo en la maquina virtual funciona perfectamente y sinceramente no me gusta copiar código en mis programas que no comprenda.

Espero alguien pueda echarme una mano a comprenderlo.

public void numeroAleatorioSinRepetirse() {// aquí genero el numero
int[] numeros = new int[4];
int sumador = 0;
for (int i = 0; i < numeros.length; i++) {
numeros[i] = sumador;
sumador++;
System.out.println(i + " = " + numeros[i]);
}
System.out.println("");
for (int i = 3; i >= 0; i--) { // aquí lo guardo en una posicion
// aleatoria
int rand = (int) (Math.random() * (i + 1));
int temp = numeros[i];
numeros[i] = numeros[rand];
numeros[rand] = temp;
System.out.println(i + " = " + numeros[i]);
}
}



daryo

bueno creo(no lo he probado) que funciona asi:
dentro del array numeros pone numeros en orden desde cero 0,1,2,3
luego cambia el orden de los numeros 1,0,3,2 usando posiciones aleatorias con math.random
buenas

elm0n0

Si, si funciona así pero no comprendo por que no repite ninguna posición por que al usar el random crea un aleatorio y en la segunda vuelta del bucle existe la posibilidad de que se repita la posición o eso es lo que me parece a mí

En la practica funciona perfectamente pero no comprendo el porque.

ivancea96

#3
Código (java) [Seleccionar]
int rand = (int) (Math.random() * (i + 1));

Siempre intercambia el número con uno en una posición inferior. Así, todos los números serán (probablemente) intercambiados. Siempre existe la posibilidad de que rand sea siempre la misma posición.

daryo

edito:lo que dice ivancea es cierto no me habia dado cuenta pero de todas formas no pasa nada si repite.

porque solo esta intercambiando de posiciones y como los numeros van en orden.
miralo de esta forma
0,1,2,3

luego toma el numero en la posicion 0 es decir el numero cero y decide intercambiarlo por un numer al azar asi que toma el 2 por ejemplo
2,1,0,3

toma el numero en la posicion 1 es decir el 1 y decide intercambiarlo por el 0
2,0,1,3

toma el numro de la posicion 2 el 1 de nuevo y lo cambia con el 1
1,0,2,3

por ultimo toma el numero de la posicion 3 y lo cambia con si mismo(algo improbable)
1,0,2,3
buenas

elm0n0

muchas gracias chicos, esta tarde conseguí entender lo del cambio de posición y estoy aplicándolo en otra parte del programa muchísimas gracias :).
Si hay forma de cerrar el post que lo cierre alguien o se me informe de como hacerlo XD.