[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.