Autor Tema: JAVA - crear matrices con números aletatorios dentro de un rango definido  (Leído 12402 veces)

drkos

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
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!
« Última modificación: 22 de Noviembre 2014, 21:46 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:JAVA - StackOverFlow
« Respuesta #1 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

drkos

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:JAVA - StackOverFlow
« Respuesta #2 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.
« Última modificación: 20 de Noviembre 2014, 16:48 por drkos »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:JAVA - StackOverFlow
« Respuesta #3 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...  ::)

drkos

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:JAVA - StackOverFlow
« Respuesta #4 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?

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:JAVA - StackOverFlow
« Respuesta #5 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

drkos

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:JAVA - StackOverFlow
« Respuesta #6 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.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:JAVA - StackOverFlow
« Respuesta #7 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

drkos

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:JAVA - StackOverFlow
« Respuesta #8 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.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:JAVA - StackOverFlow
« Respuesta #9 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("");
        }
    }
}

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".