Foro de elhacker.net

Programación => Java => Mensaje iniciado por: elm0n0 en 24 Abril 2015, 16:52 pm



Título: desglose del un método generar numero aleatorio sin que se repita JAVA
Publicado por: elm0n0 en 24 Abril 2015, 16:52 pm
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.

Código:
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]);
}
}



Título: Re: desglose del un método generar numero aleatorio sin que se repita JAVA
Publicado por: daryo en 26 Abril 2015, 15:29 pm
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


Título: Re: desglose del un método generar numero aleatorio sin que se repita JAVA
Publicado por: elm0n0 en 26 Abril 2015, 19:00 pm
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.


Título: Re: desglose del un método generar numero aleatorio sin que se repita JAVA
Publicado por: ivancea96 en 26 Abril 2015, 19:35 pm
Código
  1. 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.


Título: Re: desglose del un método generar numero aleatorio sin que se repita JAVA
Publicado por: daryo en 26 Abril 2015, 19:41 pm
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


Título: Re: desglose del un método generar numero aleatorio sin que se repita JAVA
Publicado por: elm0n0 en 30 Abril 2015, 01:00 am
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.