Problema con generazione stringa di 6 numeri casuale

di il
2 risposte

Problema con generazione stringa di 6 numeri casuale

Ciao a tutti!!
Volevo chiedervi se qualche anima pia abbia voglia di dare uno sguardo al codice e se puo' darmi un alternativa per risolvere questo problema.
Il programma simula il gioco del superenalotto: chiede all'utente la schedina dopodiche continua a generare stringhe di 6 numeri casuali tra 1 e 90; confronta schedina con estrazione e dice dopo quante estrazioni l'utente ha vinto, inoltre ripete questa cosa 10 volte e il problema nasce proprio qua; ossia ogni X estrazioni ripete la stessa stringa e quindi vince sempre ogni X estrazioni(es. dopo 300 estrazioni vince, la seconda volta vince dopo 550, la terza vince di nuovo dopo 300, la quarta vince di nuovo dopo 550 e cosi via.....)
Se non è chiaro eseguite il programmino anche se dovrete attendere un po per i risulati ahaha.
Ringrazio per l'aiuto!!
/*Il programma presenta un problema: non genera sequenze casuali ma si ripetono ogni tot cicli*/
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
int giocata[6],i,cont=0,j,estrazione[6],contest=0,contest1=0,contemp=0,ntot=0,ntot1=0,nvitt=0,vettestr[RAND_MAX];
int main()
{
    srand(time(NULL));
    /*Legge la giocata*/
    printf("Inserisci i numeri della schedina\n");
    for(i=0;i<6;i++)
    {
        printf("N %d: ",i+1);
        scanf("%d",&giocata[i]);
    }
    /*Controlla che la schedina non abbia numeri maggiori a 90 o minori a 1, se ce ne sono ricomincia*/
    for(i=0;i<6;i++)
    {
        if((giocata[i]>90)||(giocata[i]<=0))
            cont++;
    }
    if(cont!=0)
    {printf("La giocata non e' valida!!\n"); cont=0;return main();}
    /*Controlla che non ci siano numeri ripetuti, se ce ne sono ricomincia*/
    for(i=0;i<6;i++)
    for(j=0;j<6;j++)
    if(giocata[i]==giocata[j])
       cont++;
    if(cont>6)
     {printf("La giocata non e' valida!!\n");cont=0;return main();}
    /*Crea un vettore di RAND_MAX(32676) spazi in cui inserisce valori pseudo casuali da 1 a 90*/
    for(i=0;i<RAND_MAX;i++)
        vettestr[i]=rand()%90+1;
    do /*Questo ciclo ripete la vincita per più volte (cosi da ottenere una calcolo probabilitistico più giusto)*/
    {
    /*Inizializza variabili tempo*/
    time_t m;
    time_t now=time(NULL);
    do/*Questo ciclo continua a confrontare una stringa generata casualmente con la giocata finchè non siano uguali*/
    {
    do /*Questo ciclo continua a ricreare un stringa di 6 numeri finchè non sia valida(valori non ripetuti)*/
    {
        cont=0;
        /*Genero stringa di 6 numeri casuali tra 1 e 90, prendendo il valore pseudo casuale da 1 a RAND_MAX all'interno del vettore creato inzialmente*/
        for(i=0;i<6;i++)
        {estrazione[i]=rand()%RAND_MAX;estrazione[i]=vettestr[estrazione[i]];}
        /*Controllo che non ci siano ripetizioni*/
        for(i=0;i<6;i++)
        for(j=0;j<6;j++)
        if(estrazione[i]==estrazione[j])
           cont++;
    }while(cont!=6);
    cont=0;
    contest++;
    /*Controlla se la giocata e' uguale all'estrazione*/
    for(i=0;i<6;i++)
    for(j=0;j<6;j++)
    if(giocata[i]==estrazione[j])
           cont++;
    /*Risolve il problema di overflow del contatore*/
    if(contest==1000000000)
      {
          contest=0;
          contest1++;
      }
    }while(cont!=6);
    cont=0;
    nvitt++;
    printf("Hai vinto dopo N estrazioni: %d+(%d*1.000.000.000)\n\n",contest,contest1);
    for(i=0;i<6;i++)
        printf("%d ",estrazione[i]);
    printf("\n\n");
    /*Conta il tempo che ci ha messo il programma per eseguire tot cicli, precisamente stampa i secondi*/
    m=difftime(time(NULL),now);
    printf("Tempo trascorso per vincere: %ld secondi\n\n\n",m);
    m=0;
    /*Conta quanti cicli sono stati eseguiti per 10 vittorie*/
    ntot=ntot+contest;
    ntot1=ntot1+contest1;
    contest=0;
    contest1=0;
    if(ntot>=1000000000)
        {ntot=ntot-1000000000; ntot1++;}
    }while(nvitt!=10);
    printf("Num estrazioni tot: %d + (%d * 1.000.000.000)\n\n",ntot,ntot1);
    printf("Vittorie: %d\n",nvitt);
    return 0;
}

2 Risposte

  • Re: Problema con generazione stringa di 6 numeri casuale

    Credo che il problema sia nella ridondanza del valore di time(NULL) che dai in pasto alla srand...
    non ho letto il codice ma penso che questa sia l'unica motivazione,in quanto il problema sta nel "seme" che fornisci per generare i numeri casuali...
    prova a usare un altro argomento nella srand,magari inserisci quell'istruzione nel ciclo,dando come argomento una variabile a sua volta calcolata random ogni volta,che farà da seme...
    prova e fammi sapere
  • Re: Problema con generazione stringa di 6 numeri casuale

    Ciao innanzitutto ti ringrazio!! ho spostato la funzione srand(time(NULL)) all'interno del ciclo che ripete il tutto ogni volta fin quando vince... E questo mi ha risolto il problema in parte in quanto genera sempre lo stesso tipo di stringa (stessa sequenza di numeri) quando vinco.... però sta volta li genera ad un numero diverso di cicli.. Ora per il mio scopo direi che può gia andare bene però mi pacerebbe sapere come fare a cambiare anche la sequenza dei numeri della mia stringa. Ringrazio per la collaborazione!!!
    #include <stdio.h>
    #include <stdlib.h>
    #include<time.h>
    int giocata[6],i,cont=0,j,estrazione[6],contest=0,contest1=0,contemp=0,ntot=0,ntot1=0,nvitt=0,TH;
    float TG;
    int main()
    {
    
        /*Legge la giocata*/
        printf("Inserisci i numeri della schedina\n");
        for(i=0;i<6;i++)
        {
            printf("N %d: ",i+1);
            scanf("%d",&giocata[i]);
        }
        printf("\n\n");
        /*Controlla che la schedina non abbia numeri maggiori a 90 o minori a 1, se ce ne sono ricomincia*/
        for(i=0;i<6;i++)
        {
            if((giocata[i]>90)||(giocata[i]<=0))
                cont++;
        }
        if(cont!=0)
        {printf("La giocata non e' valida!!\n"); cont=0;return main();}
        /*Controlla che non ci siano numeri ripetuti, se ce ne sono ricomincia*/
        for(i=0;i<6;i++)
        for(j=0;j<6;j++)
        if(giocata[i]==giocata[j])
           cont++;
        if(cont>6)
         {printf("La giocata non e' valida!!\n");cont=0;return main();}
    
        do /*Questo ciclo ripete la vincita per più volte (cosi da ottenere una probabilità più esatta)*/
        {
        srand(time(NULL))
        /*Inizializza variabili tempo*/
        time_t m;
        time_t now=time(NULL);
        do/*Questo ciclo continua a confrontare una stringa generata casualmente con la giocata finchè non siano uguali*/
        {
        do /*Questo ciclo continua a ricreare un stringa di 6 numeri finchè non sia valida(valori non ripetuti)*/
        {
            cont=0;
            /*Genero stringa di 6 numeri casuali tra 1 e 90, prendendo il valore pseudo casuale da 1 a RAND_MAX all'interno del vettore creato inzialmente*/
            for(i=0;i<6;i++)
            estrazione[i]=rand()%90+1;
            /*Controllo che non ci siano ripetizioni*/
            for(i=0;i<6;i++)
            for(j=0;j<6;j++)
            if(estrazione[i]==estrazione[j])
               cont++;
        }while(cont!=6);
        cont=0;
        contest++;
        /*Controlla se la giocata e' uguale all'estrazione*/
        for(i=0;i<6;i++)
        for(j=0;j<6;j++)
        if(giocata[i]==estrazione[j])
               cont++;
        /*Risolve il problema di overflow*/
        if(contest==1000000000)
          {
              contest=0;
              contest1++;
          }
        }while(cont!=6);
        cont=0;
        nvitt++;
        printf("Hai vinto dopo N estrazioni: %d+(%d*1.000.000.000)\n\n",contest,contest1);
        for(i=0;i<6;i++)
            printf("%d ",estrazione[i]);
        printf("\n\n");
        /*Conta il tempo che ci ha messo il programma per eseguire tot cicli, precisamente stampa i secondi*/
        m=difftime(time(NULL),now);
        printf("Tempo trascorso per vincere: %ld secondi\n\n",m);
        TH=contest/m;
        if(contest1==0)
          {
            if(TH>=1000000)
            {TG=TH/1000000;printf("Velocita': %g GHz\n\n\n",TG);}
            else
            printf("Velocita': %d Hz\n\n\n",TH);
          }
        m=0;
        /*Conta quanti cicli sono stati eseguiti per 10 vittorie*/
        ntot=ntot+contest;
        ntot1=ntot1+contest1;
        contest=0;
        contest1=0;
        if(ntot>=1000000000)
            {ntot=ntot-1000000000; ntot1++;}
        }while(nvitt!=10);
        printf("Num estrazioni tot: %d + (%d * 1.000.000.000)\n\n",ntot,ntot1);
        printf("Vittorie: %d\n",nvitt);
        return 0;
    }
Devi accedere o registrarti per scrivere nel forum
2 risposte