Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Generare numeri casuali non ripetuti in una matrice

    Salve a tutti,
    Ho un problema, sto sviluppando un progetto per l'esame di programmazione, e devo generare delle matrici, con numeri pseudocasuali non ripetuti. I numeri devono essere nell'intervallo 1 a n^2.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    void main() {
      srand((unsigned int)time(0));
      
      int i, j, n=3; float m; m=pow((float)n,2);
      int matrice[3][3];
    
      for (i=0; i<n; i++) {
        for(j=0; j<n; j++) {
          matrice[i][j]=1+rand()%((int)m);   
          printf("%d ",matrice[i][j]);
        }
          printf("\n");
      }
    }
    Questo codice che ho sviluppato io mi riempe la matrice con numeri casuali ripetuti. Per il progetto a me serve che i numeri non si ripetano. Non ho idea di come implementarlo in C. C'è qualcuno che potrebbe adattare il controllo per non ripetere i numeri sul mio codice? Così capisco come fare.

    Grazie in anticipo a tutti

  2. #2

    Re: [C] Generare numeri casuali non ripetuti in una matrice

    Originariamente inviato da fabiospecial
    Salve a tutti,
    Ho un problema, sto sviluppando un progetto per l'esame di programmazione, e devo generare delle matrici, con numeri pseudocasuali non ripetuti. I numeri devono essere nell'intervallo 1 a n^2.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    void main() {
      srand((unsigned int)time(0));
      
      int i, j, n=3; float m; m=pow((float)n,2);
      int matrice[3][3];
    
      for (i=0; i<n; i++) {
        for(j=0; j<n; j++) {
          matrice[i][j]=1+rand()%((int)m);   
          printf("%d ",matrice[i][j]);
        }
          printf("\n");
      }
    }
    Questo codice che ho sviluppato io mi riempe la matrice con numeri casuali ripetuti. Per il progetto a me serve che i numeri non si ripetano. Non ho idea di come implementarlo in C. C'è qualcuno che potrebbe adattare il controllo per non ripetere i numeri sul mio codice? Così capisco come fare.

    Grazie in anticipo a tutti
    Una soluzione semplice ma estremamente (!) inefficace é quella di salvare il numero casuale generato e confrontarlo con i precedenti. Se non esistono corrispondenze lo inserisci. Altrimenti termini il ciclo, ne crei un nuovo e ripeti l'operazione.
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  3. #3
    Non c'è qualcuno che può farmi un esempio con un codice funzionante? :\

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    il codice funzionante non è un esempio ma una soluzione.

    prima di inserire un valore devi generarlo e confrontarlo con tutti i precedenti elementi della matrice. Devi ripetere fino a quando il confronto risulta false fino alla fine.


    invece di questa istruzione

    codice:
    matrice[i][j]=1+rand()%((int)m);
    mettici un ciclo while con dentro questa

    codice:
    int app = 1+rand()%((int)m);
    sempre nel while subito dopo fai partire un doppio ciclo for con nuovi indici (x da 0 a i e y da 0 a j-1) e confronti app con tutti i valori della sottomatrice.
    se fino alla fine non trovi un valore uguale assegna app a matrice[i][j] e imposta la condizione di uscita dal while.
    Avrai bisogno di due variabili bool una per la condizione di uscita da while piu un flag per confrontare l'unicità di app rispetto ai valori precedenti.

  5. #5
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    L'idea di tener traccia dei numeri precedentemente assegnati è buona (me ne stanno venendo altre malate in mente, ma per ora me le tengo ).

    Potresti creare una struttura dati di supporto in cui salvare i valori generati casualmente e gia assegnati. Se tieni questa struttura in ordine, puoi effettuare ricerche binarie in tempo logaritmico. O ancora, potresti usare una hash table e quindi sapere in tempo O(1) se il nuovo valore è gia stato assegnato. Ma quest'ultima è una idea particolarmente malata per un problema cosi ...semplice.
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    forse è più facile scriverli in ordine e poi mescolarli

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.