Riempimento Matrice con Numeri Casuali senza Ripetizioni in C

di il
4 risposte

Riempimento Matrice con Numeri Casuali senza Ripetizioni in C

Ciao a tutti!

Non riesco a riempire una matrice 3x3 con numeri casuali senza ripetizioni. Uso la funzione rand e senza problemi riesco a riempire la matrice con numeri casuali, ma a me serve una matrice senza numeri che si ripetono. Potete aiutarmi, per favore? 

Io ho provato con un ciclo for più interno, ma non funziona (vi scrivo sotto il codice a cui mi riferisco). 

C'è qualcosa che ho sbagliato? O è il modo sbagliato? 

Grazie mille in anticipo!!! 

for(i=0;i<3;i++){
    for(j=0;j<3;j++){
        a[i][j] = rand()%9+1;
        for(x=0;x<i;x++)
            for(y=0;y<j;y++)
                if(a[i][j] == a[x][y]){
                    i--;
                    j--;
                    break;
                }
    }
}

4 Risposte

  • Re: Riempimento Matrice con Numeri Casuali senza Ripetizioni in C

    Inizializza un array di nove elementi con {1,2,3,…,9}, fai lo shuffle di quell'array, riempi la matrice riga per riga percorrendo l'array mescolato dal primo all'ultimo elemento

  • Re: Riempimento Matrice con Numeri Casuali senza Ripetizioni in C

    05/01/2023 - Weierstrass ha scritto:


    Inizializza un array di nove elementi con {1,2,3,…,9}, fai lo shuffle di quell'array, riempi la matrice riga per riga percorrendo l'array mescolato dal primo all'ultimo elemento

    Funziona! Grazie mille! 

  • Re: Riempimento Matrice con Numeri Casuali senza Ripetizioni in C

    Altrimenti puoi provare anche

    #include <stdio.h>
    #include <stdlib.h>
    
    int vet[3][3];
    
    
    void t1()
    {
     int riga1,col1,riga2,col2;
     for(riga1=0;riga1<3;riga1++)
      {
       for(col1=0;col1<3;col1++)
        {
         // Inizializza numero trovato
         vet[riga1][col1] = rand()%9+1;
    
         // Cerchi dalla riga 0 fino alla corrente (col1)
         for(riga2=0;riga2<=riga1;riga2++)
          {
           //Cerchi per 3 colonne
           //tranne nella riga corrente che cerchi fino alla colonna corrente
           for(col2=0;col2<((riga2==riga1)?col1:3);col2++)
            {
             if(vet[riga2][col2] == vet[riga1][col1])
              {
               // torno indietro di una colonna
               col1--;
    
               //se sono indietro troppo, arretro di una riga a parto dal fondo
               //colonna
               if(col1<0) { riga1--;col1=2;}
               break;
              }
            }
          }
        }
      }
    
    }
    
    void stampa()
    {
     int riga1, col1;
     // Stampa
     for(riga1=0;riga1<3;riga1++)
      {
       for(col1=0;col1<3;col1++)
        {
         printf("%d ",vet[riga1][col1]);
        }
       printf("\n");
      }
     printf("\n");
    
    }
    
    int main (void)
    
    {
      int app;
    
     randomize();
    
     t1();
     stampa();
    
     // Attesa
     scanf("%d",&app);
    }
    
    
    
    
  • Re: Riempimento Matrice con Numeri Casuali senza Ripetizioni in C

    Siccome la discussione è interessante e si presta a molteplici soluzioni, aggiungo anche la mia.

    Per un vettore uni-dimensionale il problema è semplice:

    	int vett[9],i,j;
    	
    	srand(time(NULL));
    	
    	for(i=0;i<9;i++)
    	{
    		vett[i] = rand()%9+1;
    		for(j=0;j<i;j++)
    			if(vett[i]==vett[j])
    			{
    				i--;
    				break;
    			}
    	}

    Per una matrice (vettore di vettori) il problema è più complicato, però si può fornire una soluzione simile alla precedente utilizzando i puntatori e tenendo conto del fatto che nella realtà, poiché la memoria di un calcolatore è uni-dimensionale, le matrici vengono effettivamente memorizzate "per righe" quindi a tutti gli effetti come un vettore di m*n elementi, se m è il numero di righe e n il numero di colonne della matrice. Propongo una soluzione più generica in cui si possono definire i valori di m e n:

    	const int m=3, n=3;
    	int *p_ij, *p_k;
    	int a[m][n];
    	
    	srand(time(NULL));
    	
    	for(p_ij=&a[0][0]; p_ij<=&a[m-1][n-1]; p_ij++)
    	{
    		*p_ij = rand()%(m*n) + 1;
    
    		for(p_k=&a[0][0]; p_k<p_ij; p_k++)
    			if(*p_ij==*p_k)
    			{
    				p_ij--;
    				break;
    			}
    	}

    P.S. ho aggiunto anche un break nel ciclo più interno per evitare inutili confronti (anche se sulle macchine moderne è quasi ininfluente per dimensioni modeste).

Devi accedere o registrarti per scrivere nel forum
4 risposte