Título: Números aleatorios sin repeticion
Publicado por: samirllorente en 12 Abril 2013, 17:39 pm
Ayuda con este código, simplemente se me repite los números al azar, y eso es loq no quiero #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { string profe[5]; string materia[5][3]; int salon[5][3]; int rep; int i=0,j=0,k=0,l=0; srand(time(NULL)); do{j=0; cout<<"Ingrese profesor No "<<i+1<<": "; cin>>profe[i]; while(j!=3){ cout<<"Ingrese materia #"<<j+1<<" del profesor "<<profe[i]<<": "; cin>>materia[i][j]; do{rep=true; salon[i][j]=rand()%15+301; if((i>0)||(j>0)){k=0;l=0; while((k=!i)&&(l!=j)){ if(salon[i][j]==salon[k][l]){ rep=false;} if(l==2){l=0;k++;}else{ l++;}}} }while(rep!=true); j++;}i++; }while(i!=5); i=0; cout<<"\n\nMaestro\tMateria\tSalon\n"; while(i!=5){j=0; cout<<endl<<profe[i]; while(j!=3){ cout<<"\n\t"<<materia[i][j]<<"\t"<<salon[i][j]; j++;}i++;} return 0; }
Modificado: es mas fácil leer el código utilizando el coloreado.
Título: Re: Números aleatorios sin repeticion
Publicado por: WHK en 12 Abril 2013, 17:45 pm
Aver si te sirve este algoritmo:
Primero creas un array con todos los números que vas a procesar, por ejemplo del 0 al 500, Luego mezclas ese array al azar. Luego creas una función llamada getRand(), esa función retornará el primer valor del array y lo eliminará del stack. Si no hay valores entonces se acabaron las posibilidades de numeros al azar sin repetición.
Así lo hago yo en php y javascript.
Saludos.
Título: Re: Números aleatorios sin repeticion
Publicado por: leosansan en 12 Abril 2013, 19:32 pm
Ayuda con este código, simplemente se me repite los números al azar, y eso es loq no quiero
Por lo que entiendo pretendes repartir 15 clases. de la 301 a la 315, de forma aleatoria entre el prefesorado y según materias, de forma que no se repitan las clases asignadas, vamos algo como esto:
Ingrese profesor No 1: 1 Ingrese materia #1 del profesor 1: 11 Ingrese materia #2 del profesor 1: 12 Ingrese materia #3 del profesor 1: 13 Ingrese profesor No 2: 2 Ingrese materia #1 del profesor 2: 21 Ingrese materia #2 del profesor 2: 22 Ingrese materia #3 del profesor 2: 23 Ingrese profesor No 3: 3 Ingrese materia #1 del profesor 3: 31 Ingrese materia #2 del profesor 3: 32 Ingrese materia #3 del profesor 3: 33 Ingrese profesor No 4: 4 Ingrese materia #1 del profesor 4: 41 Ingrese materia #2 del profesor 4: 42 Ingrese materia #3 del profesor 4: 43 Ingrese profesor No 5: 5 Ingrese materia #1 del profesor 5: 51 Ingrese materia #2 del profesor 5: 52 Ingrese materia #3 del profesor 5: 53 Maestro Materia Salon 1 11 315 12 314 13 307 2 21 306 22 305 23 308 3 31 301 32 312 33 310 4 41 302 42 304 43 313 5 51 309 52 311 53 303
Otra forma, aunque básicamente es la misma que la sugerida por WHK, es usar las posibilidades de las librerías algorithm y vector, generando un vector con las clases de la 301 a la 315 y "desordenándolo" para posteriormente elegirlos en "orden", que es desordenado:#include <algorithm> #include <vector> #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { string profe[5]; string materia[5][3]; int salon[5][3]; int rep; int i=0,j=0,k=0,l=0,m=0; srand(time(NULL)); vector<int> myvector; for (int i=301; i<=315; ++i) myvector.push_back(i); random_shuffle ( myvector.begin(), myvector.end() ); do{j=0; cout<<"Ingrese profesor No "<<i+1<<": "; cin>>profe[i]; while(j!=3){ cout<<"Ingrese materia #"<<j+1<<" del profesor "<<profe[i]<<": "; cin>>materia[i][j]; do{rep=true; salon[i][j]=myvector[m]; if((i>0)||(j>0)){k=0;l=0; while((k=!i)&&(l!=j)){ if(salon[i][j]==salon[k][l]){ rep=false;} if(l==2){l=0;k++;}else{ l++;}}}m++; }while(rep!=true); j++;}i++; }while(i!=5); i=0; cout<<"\n\nMaestro\tMateria\tSalon\n"; while(i!=5){j=0; cout<<endl<<profe[i]; while(j!=3){ cout<<"\n\t"<<materia[i][j]<<"\t"<<salon[i][j]; j++;}i++;} return 0; }
Saluditos!. .....(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
|