Números aleatorios sin repeticion

Iniciado por samirllorente, 12 Abril 2013, 17:39 PM

0 Miembros y 1 Visitante están viendo este tema.

samirllorente

Ayuda con este código, simplemente se me repite los números al azar, y eso es loq no quiero
Código (cpp) [Seleccionar]
#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.
SamirLlorente

WHK

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.

leosansan

Cita de: 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


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:

Código (cpp) [Seleccionar]

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:

Código (cpp) [Seleccionar]
#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!. .....