Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: drkos en 20 de Noviembre 2014, 16:08

Título: JAVA - crear matrices con números aletatorios dentro de un rango definido
Publicado por: drkos en 20 de Noviembre 2014, 16:08
Una duda gente. No tengo mucha experiencia en JAVA y quería saber lo siguiente.
Logré lo que buscaba, hacer una matriz con ingresos aleatorios pero al mismo tiempo condicionados, pero al agregarle más condiciones la ejecución se trabó, arrojando obviamente el error de StackOverFlow, lo que es lógico por la memoria. Aclaro que las compilaciones las estoy haciendo por medio de compiladores online, así que no se si ese puede ser o no el problema del agotamiento de la memoria.

Existe alguna posibilidad de evitar este error?
Entiendo que se produce por la gran cantidad de operaciones que realiza el programa, pero si estoy tratando de generar algo aleatorio debe ser así.

Desde ya muchas gracias.
Saludos!
Título: Re:JAVA - StackOverFlow
Publicado por: Alex Rodríguez en 20 de Noviembre 2014, 16:43
Posiblemente tengas algún proceso mal planteado y eso te lleva al stackoverflow. Para comprobarlo, pega el código.

Léete esto: https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0

Si estás empezando con Java te recomiendo el curso http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

Saludos
Título: Re:JAVA - StackOverFlow
Publicado por: drkos en 20 de Noviembre 2014, 16:47
Código: [Seleccionar]
import java.util.Random;

public class PruebaMatriz{

public static int[][] matriz;
public int contador1=4,contador2=2,contador3=3;


public void CreacionMatriz(){
matriz=new int[3][3];
Random rand=new Random();
for (int k=0;k<matriz.length;k++){
for (int f=0;f<matriz.length;f++){
matriz[f][k]=rand.nextInt(3)+1;
if (matriz[f][k]==1) contador1--;
if (matriz[f][k]==2) contador2--;
if (matriz[f][k]==3) contador3--;
}
}
if (!correcta(matriz) || contador1<0 || contador2<0 || contador3<0){
CreacionMatriz();
} else {
imprimirMatriz(matriz);
System.out.println();
}
}

public boolean correcta(int[][] matriz){
if (matriz[0][0]!=1 || matriz[0][1]==1 || matriz[0][2]==3 || matriz[1][0]==3 || matriz[1][1]!=2 || matriz[1][2]==2 || matriz[2][0]!=3 || matriz[2][1]!=1 || matriz[2][2]!=3){
return false;
} else  return true;
}

public void imprimirMatriz(int[][] matriz){
for (int k=0;k<matriz.length;k++){
for (int f=0;f<matriz.length;f++){
System.out.print(matriz[f][k]+" ");
}
System.out.println();
}
}

public static void main(String []args){
PruebaMatriz form=new PruebaMatriz();
form.CreacionMatriz();
}
}

Basicamente necesito que la matriz se randomice de tal manera que los contadores nunca sean menores a 0. Son tantas las combinaciones posibles que se me traba todo jajaja.
Título: Re:JAVA - StackOverFlow
Publicado por: Alex Rodríguez en 20 de Noviembre 2014, 16:53
Pon un ejemplo con números para entender qué es lo que quieres hacer (por ejemplo un caso de matriz que fuera correcta y otro de matriz incorrecta, y cuándo es correcta por qué lo es y cuando es incorrecta por qué no lo es). A primera vista, el stackoverflow parece que se produce porque tienes una llamada recursiva no controlada, pero hay que saber exactamente qué es lo que quieres plantear...  ::)
Título: Re:JAVA - StackOverFlow
Publicado por: drkos en 20 de Noviembre 2014, 17:01
La matriz debería completarse así
1  1/2  3
2/3  2  1
1/2  1/3  3

Cuando divido con barras es porque puede entrar cualquiera de los 2 números.
Entonces, una matriz correcta sería
1  1  3
3  2  1
2  3  3
por ejemplo....

Pasa que luego le agrego la condición de los contadores y ahí es cuando se sobrecarga todo. El método recursivo lo tengo que usar si o si porque necesito generar la matriz hasta que ella cumpla con las condiciones que le quiero dar. Estimo que el código podría estructurarse de otra manera, pero aún no defino como debería ser. Si aplico una estructura repetitiva en lugar de la recursividad igualmente me va a tirar el error, no?
Título: Re:JAVA - StackOverFlow
Publicado por: Alex Rodríguez en 20 de Noviembre 2014, 17:07
He visto los ejemplos, lo que no entiendo es cuál es la lógica de los números.

¿De dónde salen los números?, es decir, ¿cuáles son las condiciones para que esos números valgan y no valgan otros? Por ejemplo donde pones 2/3 por qué vale 2 ó 3 pero no vale 1/3 ¿?

1  1/2  3
2/3  2  1
1/2  1/3  3
Título: Re:JAVA - StackOverFlow
Publicado por: drkos en 20 de Noviembre 2014, 17:15
No te preocupes por la lógica porque no la hay, es arbitrario, yo decidí que números quiero que aparezcan y cuales no.
Acabo de intentar eliminando la recursividad y reemplazándola por un while y ya no me tira más el StackOverFlow, pero igual se queda pensando y termina por matar el proceso sin arrojar resultados. Evidentemente son tantas las combinaciones que pueden hacerse que es una operación que una computadora casera no puede hacer.
Título: Re:JAVA - StackOverFlow
Publicado por: Alex Rodríguez en 20 de Noviembre 2014, 21:31
Si simplemente quieres crear una matriz 3x3 donde los números que pueden aparecer sean los indicados sí es fácil de hacer (simplemente codificar que aleatoriamente aparezca uno de los números posibles en la posición correspondiente). Pero si no tienes una lógica, ¿cómo crearías una matriz de 4x4 ó de 5x5 ó de 6x6...?

Aquí tienes una referencia de aleatoriedad en Java: http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=638:generar-numeros-aleatorios-en-java-clase-random-y-metodo-nextint-ejercicio-ejemplo-resuelto-cu00672b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

Saludos
Título: Re:JAVA - StackOverFlow
Publicado por: drkos en 21 de Noviembre 2014, 13:04
Es que no hay una lógica, es arbitrario, pero tengo que necesariamente dejar lugares optativos donde pueda haber más de una opción de numeración, y ahí es donde entra la aleatoriedad que necesito, y esa misma aleatoriedad hace que el sistema se sobrecargue.
Título: Re:JAVA - StackOverFlow
Publicado por: Alex Rodríguez en 22 de Noviembre 2014, 21:45
Aquí tienes un código con el que puedes resolver el problema concreto que planteaste (o eso creo):

Código: [Seleccionar]
import java.util.Random;

public class PruebaMatriz{

    public static int[][] matriz;

    public void CreacionMatriz(){
        matriz=new int[3][3];
        matriz[0][0]=1;
        Random numAleatorio;
        numAleatorio = new Random ();
        matriz[0][1] = numAleatorio.nextInt(2)+1;   
        matriz[0][2] = 3;
        matriz[1][0] = numAleatorio.nextInt(2)+2;
        matriz[1][1] = 2;
        matriz[1][2]= 1;
        matriz[2][0] = numAleatorio.nextInt(2)+1;
        matriz[2][1] = numAleatorio.nextInt(3)+1;
        matriz[2][2] = 3;
    }

    public int[][] getMatriz() {return this.matriz;}

    public void imprimirMatriz(int[][] matriz){
        for (int k=0;k<matriz.length;k++){
            for (int f=0;f<matriz.length;f++){
                System.out.print(matriz[k][f]+" ");
            }
            System.out.println();
        }
    }

    public static void main(String []args){

        System.out.println("Ejemplos ");
        for (int i=0; i<10; i++){
            PruebaMatriz form=new PruebaMatriz();
            form.CreacionMatriz();
            form.imprimirMatriz(form.getMatriz());
            System.out.println("");
            System.out.println("********************************");
            System.out.println("");
        }
    }
}