[c++] numeri casuali in un ciclo for
Ciao a tutti, volevo fare un programma che ha un'array contenente 3 liste, che inserisca in ordine 10 elementi casuali scegliendo casualmente tra una delle 3 liste! Il mi problema è che i numeri casuali sono sempre uguali! Come posso rimediare?
STRUTTURE DATI:
FUNZIONE RANDOM:
FUNZIONE INSERIMENTO:
FUNZIONE STAMPA:
NEL MAIN:
In pratica lui mi trova 10 volte lo stesso numero e tutte le volte lo inserisce nella stessa lista scelta a caso..
Io voglio 10 numeri diversi ogni volta inseriti in una lista diversa..
E un'altra domanda: l'array non lo sto usando non è vero?
STRUTTURE DATI:
typedef struct TipoDato{ int x; }; struct El{ TipoDato info; struct El *next; }; typedef struct El ElemLista; typedef ElemLista *ListaDiElem;
FUNZIONE RANDOM:
int random_n(int min,int max){ int x; srand(time(NULL)); x=rand()%(max-min+1)+min; }
FUNZIONE INSERIMENTO:
void InsertInOrder(ListaDiElem *lista, int value){ ElemLista *punt,*puntcorrente,*puntprecedente; puntcorrente = *lista; puntprecedente= NULL; while(puntcorrente!=NULL && value>puntcorrente->info.x){ puntprecedente=puntcorrente; puntcorrente = puntcorrente->next; } punt = (ElemLista *)malloc(sizeof(ElemLista)); punt->info.x=value; punt->next = puntcorrente; if(puntprecedente!=NULL){ puntprecedente->next = punt; }else{ *lista=punt;} }
FUNZIONE STAMPA:
void Stampa(ListaDiElem lista){ ListaDiElem punt; punt=lista; if(punt==NULL){ cout<<"la lista e' vuota"<<endl; }else{ while(punt!=NULL){ cout<<punt->info.x<<"-"; punt=punt->next;} } }
NEL MAIN:
ListaDiElem lista0,lista1,lista2; ElemLista *array[NLISTE]; int i,x,y; lista0 = Create_lista(); lista1 = Create_lista(); lista2 = Create_lista(); array[0]=lista0; array[1]=lista1; array[2]=lista2; for(i=0;i<10;i++){ srand(time(0)); x=random_n(0,100); y=random_n(0,2); cout<<"elemento "<<x<<"verra' inserito nella lista"<<y<<endl; if(y==0){ InsertInOrder(&lista0,x); }else{ if(y==1){ InsertInOrder(&lista1,x); }else{ if(y==2){ InsertInOrder(&lista2,x);}}} } cout<<"lista0:"<<endl; Stampa(lista0); cout<<"lista1:"<<endl; Stampa(lista1); cout<<"lista2:"<<endl; Stampa(lista2);
In pratica lui mi trova 10 volte lo stesso numero e tutte le volte lo inserisce nella stessa lista scelta a caso..
Io voglio 10 numeri diversi ogni volta inseriti in una lista diversa..
E un'altra domanda: l'array non lo sto usando non è vero?
Risposte
srand va chiamato una sola volta all'inizio del main e basta.. Inizializza il generatore di numeri pseudocasuali e siccome il valore restituito da time cambia una volta al secondo il generatore di numeri pseudocasuali viene inizializzato in continuazione con lo stesso valore. E quindi il primo valore restituito da rand sarà sempre lo stesso..
Quindi non va bene metterlo nella funzione di random?
No, non va bene.. e il motivo mi sembra evidente.