Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    58

    [C] Estrarre numeri casuali senza ripetizioni

    Volevo fare un programma che simula la lotteria e che quindi deve estrarre dei numeri casuali senza però che si ripetano. Ho scritto un codice che però a quanto pare non funziona, perché mi restituisce lo stesso numeri con qualche ripetizione.
    Ho provato a cercare sul web ma non ho trovato niente di soffisfacente

    Mi aiutate a capire dove ho sbagliato?

    codice:
    #include <stdio.h>#include <stdlib.h>
    #include <time.h>
    
    
    #define n_max 10
    #define n_min 1
    
    
    void estrazione(int[]);
    
    
    int main(){
      int i;
      srand48(time(0));
      int num[6] = {0};
      estrazione(num);
      for(i = 0; i < 6; i++){
        printf("%d\n", num[i]);
      }
    }//main
    
    
    void estrazione(int num[]){
      int *P_num;
      P_num = num;
      int i,j;
      int ok = 0;
     
      for(i = 0; i < 6; i++){
        ok = 1;
        while (ok == 1) {
          *(P_num + i) = n_min + (double)lrand48() / RAND_MAX * n_max;
          for(j = 0; j < i; j++){
        if(*(P_num + j) == *(P_num + i)){
          ok = 1;
          }  //fine if
        }//fine secondo for
          ok = 0;
       }// fine while
     } //fine primo for
      
    }//estrazione
    Grazie in anticipo
    Ultima modifica di sheldon; 27-01-2015 a 14:21

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao, giusto ieri ho scritto un post su questo argomento su un altro forum. Lo linko sperando che non sia un problema: link.


  3. #3
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    58
    Quote Originariamente inviata da minomic Visualizza il messaggio
    Ciao, giusto ieri ho scritto un post su questo argomento su un altro forum. Lo linko sperando che non sia un problema: link.

    Grazie, ho seguito le tue istruzioni ed effettivamente funziona, solo che ogni tanto mi dà due numeri uguali

    codice:
     int i,j;  int estraendi[n_max] = {0};
      int index = 0;
      for(i = 0; i < n_max; i++){
        estraendi[i] = i + 1;
      }
      for(i = 0; i < 6; i++){
        j = i;
        if(i == 0){
          j = 1;
        }
        index = (float)lrand48() / RAND_MAX * (n_max - j);
        num[i] = estraendi[index];
        estraendi[index] = estraendi[n_max - j];
      }

  5. #5
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Secondo me c'è qualcosa che non va... Con questo codice non ottengo ripetizioni:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define MAX 10
    
    int main() {
        srand(time(NULL));
        int rimanenti = MAX;
        int da_estrarre[MAX];
        int i, index;
        for(i=0; i<MAX; ++i) {
            da_estrarre[i] = i+1;
        }
    
        for(i=0; i<MAX; ++i) {
            index = rand() % rimanenti;
            printf("Estratto: %d\n", da_estrarre[index]);
            da_estrarre[index] = da_estrarre[rimanenti-1];
            rimanenti--;
        }
    
        return 0;
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    58
    Quote Originariamente inviata da minomic Visualizza il messaggio
    Secondo me c'è qualcosa che non va... Con questo codice non ottengo ripetizioni:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define MAX 10
    
    int main() {
        srand(time(NULL));
        int rimanenti = MAX;
        int da_estrarre[MAX];
        int i, index;
        for(i=0; i<MAX; ++i) {
            da_estrarre[i] = i+1;
        }
    
        for(i=0; i<MAX; ++i) {
            index = rand() % rimanenti;
            printf("Estratto: %d\n", da_estrarre[index]);
            da_estrarre[index] = da_estrarre[rimanenti-1];
            rimanenti--;
        }
    
        return 0;
    }
    Così funziona anche a me!
    Non avevo considerato di usare il pre-incremento per i

  7. #7
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ma dici nel ciclo for? Secondo me non era quello il problema... Più che altro la gestione dei rimanenti e dei sorteggi entro un limite sempre minore.

    Comunque se funziona... meglio!

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.