Java - Problema con bucles for/do-while/while

 
Vista:
sin imagen de perfil
Val: 9
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con bucles for/do-while/while

Publicado por Abel (6 intervenciones) el 06/01/2019 19:45:00
Buenas a todos, tengo un problema con los bucles. Tengo un proyecto el cual se tiene que repetir 1,000 veces pero no se por qué, cada vez que lo ejecuto, se repite unas 900 veces. Cada vez que lo ejecuto se repite de forma diferente, unas 980, otras 970 y no se por qué nunca llega a 1,000.
En el proyecto tengo un array (llamada alumnos) la cual relleno con los valores [1,30]. En esa array tengo que sacar, por así decirlo, un ganador. Para ello lo que se hace es crear un random con valores [1,30]. Con ese random voy "eliminando" números del array alumnos, cada vez que sale un random le pongo un -1 en la misma posicion del array, asi hasta que quede un único numero en alumnos, y esa posición será la "ganadora". Por ello utilizo el contador<29 para salir del bucle, cuando se coloquen 29 veces el -1 ya puedo salir del bucle porque tengo un ganador.
Entonces, con el ganador lo que hago es incluirlo en otra array (llamada delegado), esa array ira aumentando las veces que han salido ganadores esas posiciones. Y esto tiene que hacerlo 1,000 veces, para poder determinar que posicion ha salido ganadora más veces. Muchas gracias y un saludo. Dejo aquí el código.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package delegadocasa;
 
import java.util.Random;
 
/**
 *
 * @author Abel
 */
public class DelegadoCasa {
 
    public static void main(String[] args) {
        int valor,contador=0,cont=0;
        int[] alumnos=new int [30];
        int[] delegado=new int [30];
        Random rand=new Random();
 
        for (int j = 0; j < 1000; j++) {
 
            for(int i=0;i<alumnos.length;i++){
            alumnos[i]=i+1;
            }
            contador=0;
 
            do{
                for(int i=0;i<alumnos.length;i++){
                    valor=rand.nextInt(30)+1;
                    while(alumnos[i]==valor){
                        alumnos[i]=-1;
                        contador++;
                    }
                }
            }while(contador<29);
 
            for(int i=0;i<alumnos.length;i++){
                if(alumnos[i]!=-1){
                        delegado[i]++;
                        cont++;
                        }
            }
        }
        for(int n:delegado){
            System.out.print(n+" ");
        }
        System.out.println(" ");
        System.out.println(cont);
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema con bucles for/do-while/while

Publicado por Kabuto (1381 intervenciones) el 06/01/2019 20:25:56
Hola,

La parte del código donde vas colocando los -1, provoca un comportamiento inesperado.

Modificando ligeramente esa parte, se consigue que se repita siempre las 1000 veces.
Lo que hago es primero generar el numero random, y luego revisar las 30 posiciones del array preguntando con un if (y no con un while) si coincide o no.
Es muy parecido a lo que tú hacias, pero tú generas el random dentro del for, así que este random varía cada vez que se recorre una posición, lo cuál no asegura que consigas sustituir todos las posiciones (menos una) con -1. Seguramente se quedarán algunas sin ser sustituidas.

Prueba así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class DelegadoCasa {
 
	public static void main(String[] args) {
		int valor,contador=0,cont=0;
		int[] alumnos=new int [30];
		int[] delegado=new int [30];
		Random rand=new Random();
 
		for (int j = 0; j < 1000; j++) {
 
			for(int i=0;i<alumnos.length;i++){
				alumnos[i]=i+1;
			}
			contador=0;
 
			/*
			do{
				for(int i=0;i<alumnos.length;i++){
					valor=rand.nextInt(30)+1;
					while(alumnos[i]==valor){
						alumnos[i]=-1;
						contador++;
					}
				}
			}while(contador<29);*/
 
			while (contador < 29)
			{
				valor=rand.nextInt(30)+1;
				for(int i=0;i<alumnos.length;i++)
					if (valor == alumnos[i])
					{
						alumnos[i] = -1;
						contador++;
					}
			}
 
			for(int i=0;i<alumnos.length;i++){
				if(alumnos[i]!=-1){
					delegado[i]++;
					cont++;
				}
			}
		}
		for(int n:delegado){
			System.out.print(n+" ");
		}
		System.out.println(" ");
		System.out.println(cont);
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 9
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con bucles for/do-while/while

Publicado por Abel (6 intervenciones) el 07/01/2019 16:30:26
Muchas gracias, ahora me sale perfecto. Lo que me pasaba es que en algunas repeticiones del bucle, algun array se quedaba con varios -1 y entonces eso no me lo detectaba el contador y por eso salían menos de 1,000. Ahora sale a la perfección y además he entendido el error que estaba cometiendo. Muchas gracias y muy amable.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar