Matrice random

di il
4 risposte

Matrice random

Salve ragazzi sto sviluppando un software che replica il gioco del futoshiki io ho pensato di creare una matrice random cioè una matrice di int scelti a caso tramite il metodo Math.random().
Però ho riscontrato un problema non indifferente :secondo il modo in cui ho implementato la classe
la realizzazione della matrice avviene in maniera motlo lenta o addirittura entra in un ciclo infinito.


Posto parte del codice
public class MatriceRandom {
      int m[][];


public MatriceRandom(){
   m=new int [5][5];
    int i=0;
    int a[]=new RandomArray().getArray();
    while(i<5){
    for(int j=0;j<5;j++){
    m[i][j]=new RandomArray().costruisci();
      if(i==0)
          m[i][j]=a[j];
    if(i==1 && j==0)
      while(m[i][j]==m[i-1][j])
          m[i][j]= new RandomArray().costruisci();
    if(i==1 && j==1)
          while(m[i][j]==m[i][j-1] || m[i][j]==m[i-1][j])
             m[i][j]= new RandomArray().costruisci();
           if(i==1 && j==2)
              while(m[i][j]==m[i][j-1] || m[i][j]==m[i-1][j] || m[i][j-2]==m[i][j] )
                        m[i][j]= new RandomArray().costruisci();
                     if(i==1 && j==3)
                     while(m[i][j]==m[i][j-1] || m[i][j]==m[i-1][j] || m[i][j-2]==m[i][j] || m[i][j]==m[i][j-3] )
                         m[i][j]= new RandomArray().costruisci();
                   if(i==1 && j==4)
                      while(m[i][j]==m[i][j-1] || m[i][j]==m[i-1][j] || m[i][j-2]==m[i][j] || m[i][j]==m[i][j-3] || m[i][j]==m[i][j-4])
                         m[i][j]= new RandomArray().costruisci();
                            if(i==2 && j==0)
                         while(m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j])
                          m[i][j]= new RandomArray().costruisci();
                           if(i==2 && j==1)
                         while(m[i][j]==m[i][j-1]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j])
                          m[i][j]= new RandomArray().costruisci();
                           if(i==2 && j==2)
                          while(m[i][j]==m[i][j-1]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i][j-2])
                          m[i][j]= new RandomArray().costruisci();
                             if(i==2 && j==3)
                          while(m[i][j]==m[i][j-1]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j] || m[i][j]==m[i][j-2]||m[i][j]==m[i][j-3])
                          m[i][j]= new RandomArray().costruisci();
                           if(i==2 && j==4)
                           while(m[i][j]==m[i][j-1]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i][j-2]||m[i][j]==m[i][j-3]||m[i][j]==m[i][j-4])
                          m[i][j]= new RandomArray().costruisci();
                        if(i==3 && j==0)
                    while(m[i][j]==m[i-1][j]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i-3][j])
                       m[i][j]= new RandomArray().costruisci();
                          if(i==3 && j==1)
                        while(m[i][j]==m[i-1][j]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i-3][j] || m[i][j]==m[i][j-1])
                          m[i][j]= new RandomArray().costruisci();
                            if(i==3 && j==2)
                           while(m[i][j]==m[i-1][j]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i-3][j] || m[i][j]==m[i][j-1]||m[i][j]==m[i][j-2])
                          m[i][j]= new RandomArray().costruisci();
                             if(i==3 && j==3)
                           while(m[i][j]==m[i-1][j]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i-3][j] || m[i][j]==m[i][j-1]||m[i][j]==m[i][j-2]||m[i][j]==m[i][j-3])
                          m[i][j]= new RandomArray().costruisci();
                               if(i==3 && j==4)
                           while(m[i][j]==m[i-1][j]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i-3][j] || m[i][j]==m[i][j-1]||m[i][j]==m[i][j-2]||m[i][j]==m[i][j-3]||m[i][j]==m[i][j-3])
                          m[i][j]= new RandomArray().costruisci();
                                if(i==4 && j==0)
                           while(m[i][j]==m[i-1][j]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i-3][j]||m[i-4][j]==m[i][j])
                                   m[i][j]= new RandomArray().costruisci();
                                   if(i==4 && j==1)
                               while(m[i][j]==m[i-1][j]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i-3][j]||m[i-4][j]==m[i][j]|| m[i][j]==m[i][j-1])
                                   m[i][j]= new RandomArray().costruisci();
                                 if(i==4 && j==2)
                               while(m[i][j]==m[i-1][j]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i-3][j]||m[i-4][j]==m[i][j]|| m[i][j]==m[i][j-1]||m[i][j]==m[i][j-2])
                                   m[i][j]= new RandomArray().costruisci();
                                  if(i==4 && j==3)
                               while(m[i][j]==m[i-1][j]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i-3][j]||m[i-4][j]==m[i][j]|| m[i][j]==m[i][j-1]||m[i][j]==m[i][j-2]||m[i][j]==m[i][j-3])
                                   m[i][j]= new RandomArray().costruisci();
                                       if(i==4 && j==4)
                               while(m[i][j]==m[i-1][j]||m[i][j]==m[i-1][j]||m[i][j]==m[i-2][j]||m[i][j]==m[i-3][j]||m[i-4][j]==m[i][j]|| m[i][j]==m[i][j-1]||m[i][j]==m[i][j-2]||m[i][j]==m[i][j-3]||m[i][j]==m[i][j-4])
                                   m[i][j]= new RandomArray().costruisci();




    }

    i++;
    }
}
il metodo costruisci di RadomaArray restiuisce a caso un int tra 1 e 5 visto che la matrice è 5x5

Nell'attesa di una risposta mando i miei più cordiali saluti a tutti.

4 Risposte

  • Re: Matrice random

    Premesso che il codice è illegibile volevo sapere se Random sono gli elementi della matrice o pure la dimensione o tutte e due??
  • Re: Matrice random

    Gli elementi devono essere random , gli elementi vanno da 1 a 5 e per ogni cella non deve esistre un numero uguale sulla riga e sulla colonna di appartenenza.
  • Re: Matrice random

    Il codice che ti posto crea e stampa una matrice 5x5 in cui ogni valore random è unico su riga e colonna in cui si trova
    import java.util.Random;
    
    /**
     *
     * @author jump
     */
    public class MatriceRandom {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            Random randomGenerator = new Random();
    
            int righe = 5;
            int colonne = righe;
            int valoremassimoassegnabile = colonne + 1;
            int trovato;
            int error;
            Integer[][] A = new Integer[righe][colonne];
    
    
    
    
            for (int i = 0; i < righe; i++) {
                for (int j = 0; j < colonne; j++) {
                    A[i][j] = 0;
                }
            }
    
    
    
    
    
            for (int i = 0; i < righe; i++) {
    
                for (int j = 0; j < colonne; j++) {
    
                    if (A[i][j] == 0) {// se la posizione è libera
                        trovato = 0;//ripristino trovato
    
                        while (trovato == 0) {//finquando non trovo il valore da assegnare
                            error = 0;
                            int x = randomGenerator.nextInt(valoremassimoassegnabile);//assegna tra 0 e val massimo escluso
                            if (x == 0) // se è 0 lo porto ad uno
                            {
                                x = 1;
                            }
    
    
                            for (int z = 0; z < colonne; z++) {  
                                if (x == A[i][z]) {//se trovo un elemento uguale a quello candidato  sulla riga
                                    error = 1;//x non è valido
                                    break;//
                                }
                            }
    
                            if (error == 1) {
                                continue;//se x è stato trovato sulle righe provo altro x
                            }
                            for (int k = 0; k < righe; k++) {
                               
                                if (x == A[k][j]) {//se trovo un elemento uguale a quello candidato  sulla colonna
                                    error = 1;//x non è valido
                                    break;// esco e ne provo un altro
    
    
                                }
                            }
    
                            if (error == 1) {
                                continue;//se x è stato trovato sulle righe provo altro x
                            }
                            A[i][j] = x;
                            
                            trovato = 1;
    
                        }//fine ciclo ricerca
                    }//fine posizione libera
    
    
                }
    
    
    
    
            }
    
    
    
    // stampo matrice
            System.out.println("Matrice");
    
    
            for (int i = 0; i < righe; i++) {
                for (int j = 0; j < colonne; j++) {
                    if ((j + 1) % colonne == 0) {
                        System.out.println(A[i][j] + " ");
                    } else {
                        System.out.print(A[i][j] + " ");
                    }
                }
            }
    
    
    
        }
    }
    

    nota:Il problema del loop infinito è legato alla funzione di generazione dei numeri casuali e soprattutto alla probabilità, che diminusice all'aumetare della dimensione della matrice, che un numero random da 1 a 5 non esista già su una stessa riga e colonna . Infatti se provi a costruire matice di dimensione miniri a 5 l'aoutput è quasi immediato.


    ps: Se va in loop , stoppa l'esecuzione e riavvia il programma, dopo 2 massimo 3 tentativi la matrice viene fuori.
  • Re: Matrice random

    Ciao grazie mille per la soluzione sei stato gentilissimo.
Devi accedere o registrarti per scrivere nel forum
4 risposte