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;
}