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

    [DEV C++]Problema con condizione di uscita

    Ciao.Non vi metto tutto il codice del programma, ma vi dico in breve che cosa sto facendo in questo pezzo:
    Sto generando dei numeri casuali che mi serviranno in seguito,la generazione si ripete ogni volta che il ciclo rincomincia.Il problema (visto che il rang va fino a 12)è che c'è una elevata probabilità che mi esca un numero già usato, questo non voglio che succeda.
    Non so però come evitarlo.LA mia idea è stata di salvare tutti i numeri in random in un array e mettere una condizione di uscita che confronta il nuovo numero generato con quelli nell'array.
    Il problema è che non sono in grado di scriverla xD
    Il pezzo di codice è questo

    codice:
    for(c=0;c<n;c++)
          {
                          colore(5);
                          printf("\nGiocatore %d,come ti chiami: ",k);
                          scanf("%s",nome[c]);
                          k++; 
                          doppio=null; //resetto l'array 
                          
                          for(h=0;h<4;h++)
                          {
                                          do
                                          {
                                              srand((unsigned)time(NULL));
                                              R=rand() % 12;
                                              doppio[D]=R;
                                              D++;
                                          }
                                          while(R==

    Che cosa scrivo come condizione???

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    int *generati conterrà i numeri generati (dovrebbero essere massimo 12??).

    Allochi lo spazio: generati = (int*) malloc(12*sizeof(int));
    quando invochi la funzione di generazione dei numeri casuali, inserisci in generati[i] il valore e incrementi la i. Alla nuova generazione devi fare un ciclo sull'array "generati", confrontando il numero appena creato con tutti i valori che hai già inserito nell'array.

    In pseudocode:

    codice:
    numero_rand = genero_numero_casuale; 
    for(i=0;i<13;i++)
       if(numero_rand == generati[i]){
              genera_altro_numero; 
              ripeti_controllo;
        }

  3. #3
    Ok grazie, ho risolto questo problema...

    Ora ho altre 2 domande
    1: la funzione può generare anche '0' come numero random???
    2: come "cancello" i dati nell'array dopo ogni ciclo??? quello che ho scritto prima =NULL o non funziona o non so come si usa xD

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Se generi numeri interi compresi tra 0 e 12, anche lo 0 può essere generato. Inoltre, i dati nell'array li puoi cancellare dopo che hai terminato la generazione di tutti i numeri!

    Per deallocare l'array basta un free(generati).

    Ps. Il codice che è scritto sopra è molto poco comprensibile, ti conviene ripostarlo o modifare quello esistente.

  5. #5
    Non so se ho scritto male, ma non ci sono riuscito xD
    Io ho fatto
    codice:
     
         srand((unsigned)time(NULL));
         R=rand() % (12-1)+1;
         doppio[D]=R;
         D++;
         for(i=0;i<D;i++)
         {
                            do
                            {
                                   if(doppio[D-1]==R)
                                    {               
                                           srand((unsigned)time(NULL));
                                           R=rand() % (12-1)+1;
                                    }
                             }  
                         while(doppio[D-1]==R);
    genero un numero casuale,lo copio in un array(con D=0inizialmente),aumento D,faccio il ciclo 1 volta perchè c'è un solo numero da confrontare.
    Se il numero è uguale (e lo è per forza perchè l'ho scritto prima) ne genero un altro,fino a che ne genero uno diverso...Detto così dovrebbe funzionare, ma l'ho scritto nel modo sbagliato e non funziona, nel senso che mi da numeri che sono già stati generati.Qualcuno riesce a spiegarmi dove sbaglio?

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Guarda, è questo il codice che devi usare:

    codice:
    #include <time.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    int isDoppio(int*array, int x, int len){
    int i;
    
        for(i=0;i<len; i++)
            if(array[i] == x) return 1;
    
    return 0;
    }
    
    
    void main(){
    srand(time(NULL));
    int *generati;
    int val;
    int i=0;
    generati = (int*) malloc(12*sizeof(int));
    
    for(i=0;i<11;i++){
        val = rand()%12;
        do{
            if( isDoppio(generati, val, 12) == 1)
                val = rand()%12;
            else{
             generati[i] = val;
             break;
            }
    
        }while(1);
    }
    
    for(i=0;i<12;i++)
        printf("%d\n", generati[i]);
    }
    Con il ciclo for generi 12 numeri casuali, con il do-while controlli che siano uguali, se lo sono, ne generi un'altro, altrimenti lo inserisci nel vettore e riparti. Non capisco molto bene il tuo codice, perchè inserisci tutti i valori che generi nell'array doppio? Mi spieghi la logica del tuo codice? Così possiamo discuterne insieme..

  7. #7
    Ciao, grazie per la risposta.Sfortunatamente non l'ho vista in tempo e ho risolto in un altro modo.Il codice che ho scritto ieri sera non ha molto senso ora che lo riguardo.questa mattina che era più lucido ho risolto così

    codice:
     srand((unsigned)time(NULL));
               R=rand() % 13;
               for(i=0;i<13;i++)
               {
                         if(R==doppio[i])
                         {
                                i=0;
                                srand((unsigned)time(NULL));
                                R=rand() % 13;
                         }
                }
               doppio[D]=R;
               D++;
    ho seguito la linea dello pseudo-codice che mi avevi scritto, solo che ieri sera facevo l'errore di copiare i numeri prima dei controlli, ora li copio dopo e funziona perfettamente.

    Volevo fare ancora un'altra domanda. In un certo punto del mio codice mi serve "svuotare" il contenuto dell'array "doppio"contenente i numeri creati.Ho provato a inserire free(doppio), come mi avevi suggerito, ma non me lo pulisce.Come posso fare???

    Grazie per avermi aiutato

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    C'è differenza tra "pulire" e deallocare una zona di memoria. Se a te interessa "resettare" l'array di numeri creati, inserendo ad esempio un valore che non può essere gerato per indicarti che quella posizione è libera, devi fare un ciclo e assegnare il valore voluto ad ogni elemento dell'array:

    for(i=0; i<lunghezzaArray; i++)
    array[i] = -1;

    Se vuoi deallocare invece l'array, fai:
    free(array);
    array = NULL;


    C'è molta differenza tra le due operazioni. Con la prima non perdi l'area di memoria puntata da array, con la seconda liberi la memoria che precedentemente avevi riservato con la malloc. Tu cosa devi fare di preciso?

  9. #9
    Originariamente inviato da Smoke666
    C'è differenza tra "pulire" e deallocare una zona di memoria. Se a te interessa "resettare" l'array di numeri creati, inserendo ad esempio un valore che non può essere gerato per indicarti che quella posizione è libera, devi fare un ciclo e assegnare il valore voluto ad ogni elemento dell'array:

    for(i=0; i<lunghezzaArray; i++)
    array[i] = -1;

    Se vuoi deallocare invece l'array, fai:
    free(array);
    array = NULL;


    C'è molta differenza tra le due operazioni. Con la prima non perdi l'area di memoria puntata da array, con la seconda liberi la memoria che precedentemente avevi riservato con la malloc. Tu cosa devi fare di preciso?
    A me serviva teoricamente che l'array "doppio" con dentro n numeri, a un certo punto tornasse come nuovo, cioè senza nessun valore al suo interno.
    Avevo pensato anche io di fare un ciclo, però avevo pensato a inserire in ogni cella lo 0, e questo sarebbe stato un problema; non avevo pensato di mettere un numero negativo, con quello dovrebbe funzionare..
    GRAZIE, mi sei stato di grande aiuto!

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Puoi usare un qualunque numero che non può essere creato da rand

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 © 2024 vBulletin Solutions, Inc. All rights reserved.