L'ultimo algoritmo non mi soddisfava molto visto che era strutturato maluccio.

Cosi mi sono messo a rifarlo.

Allora questi è il main
codice:
static int[]v=new int[8];

    static int[][]m=new int[4][8];

    public static void main(String[]args){

        

        int c;
        

        for(int i=0;i<m.length;i++){
            
            for(int j=0;j<m[0].length;j++){
                
                do{

                    c=(int)(Math.random()*8)+1;
                    
                }
                
                while(verificaNumeriDiversi(c)==false && verificaCoppie(c)==false);

                v[j]=c;

                m[i][j]=c;

            }

            for(int x=0;x<v.length;x++){

                v[x]=0;

            }

        }
           
        for(int i=0;i<m.length;i++){
            
            for(int j=0;j<m[0].length;j++){
                
                System.out.print(m[i][j]+" ");
                
            } 
            
            System.out.println();

        }
Come vedete il controllo lo faccio ad ogni numero generato e non ad ogni matrice generata come prima.

Ora il concetto è: continuo a generare un numero casuale fino a quando
1>Il numero generato è diverso da ogni altro numero della riga
2>La coppia di numeri è diversa e unica

Ora per il punto 1 ho creato la seguente classe perfettamente funzionante

codice:
public static boolean verificaNumeriDiversi(int c){

        for(int x=0;x<v.length;x++){

                       if(c==v[x]){

                           return false;

                           }

       }
        
        return true;

    }
L'array V è globale e viene usato per "contenere" i numeri estratti

Per il punto 2 stavo pensando a qualcosa del genere
codice:
    public static boolean verificaCoppie(int c){

         for(int i=0;i<m.length-1;i++){

            for(int j=0;j<m[0].length;j=j+2){

                if(c==m[i+1][j] && m[i][j+1]==m[i+1][j+1]){
                    
                    return false;
                }
                
            }
         }
         return true;

    }
ma non funziona non esegue il controllo

Mi potete dare una mano? Come dicevo prima mi serve una classe che controlli gli accoppiamenti di ogni numero uscito