Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: UmbraNoche en 21 Enero 2015, 01:27 am



Título: Programa que genera números aleatorios sin repetir en C++
Publicado por: UmbraNoche en 21 Enero 2015, 01:27 am
Buenas gente aquí les dejo un programa que hice traveseando un poco el código para generar números aleatorios sin que se repitan. Si tienen sugerencias de cómo hacerlo más eficiente por favor no duden en comentar, soy nuevo en esto de la programación y cualquier sugerencia será bienvenida.


Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8.  
  9.    int arreglo[10];
  10.    int aux = 0;
  11.  
  12.    srand(time(0));
  13.  
  14.    for(int i = 0; i < 10; i++){
  15.        aux = (1 + rand() % 15);
  16.  
  17.        int aux2 = 0;
  18.  
  19.        while(aux2 < i){
  20.  
  21.            if(aux != arreglo[aux2])
  22.                aux2++;
  23.  
  24.            else{
  25.                    aux = (1 + rand() % 15);
  26.                    aux2 = 0;
  27.  
  28.                }
  29.        }
  30.  
  31.        arreglo[i] = aux;
  32.  
  33.        cout << arreglo[i] << "\n";
  34.    }
  35.  
  36.    return 0;
  37. }
  38.  


Título: Re: Programa que genera números aleatorios sin repetir en C++
Publicado por: sabeeee en 26 Enero 2015, 01:27 am
Yo lo haría para números mas grandes, esa seria mi sugerencia, yo también soy nuevo y no te hago esto ni a palos  ;-) :laugh:.


Título: Re: Programa que genera números aleatorios sin repetir en C++
Publicado por: eferion en 26 Enero 2015, 17:20 pm
La eficiencia es un término que suele ser complicado de acotar. Te pongo algunas notas genéricas:

* La eficiencia se mide únicamente por tiempo, por consumo de memoria o por un equilibrio entre ambos?

* Depende del número de elementos a manejar. El algoritmo más eficiente para una población pequeña suele ser diferente del más eficiente para una población grande.

* Depende de los requisitos de la aplicación

* Depende de la arquitectura de la máquina sobre la que funciona el algoritmo.

A modo de ejemplo, para rellenar un vector de 10 elementos no vas a notar ninguna diferencia entre usar un algoritmo super optimizado y el que tienes ya hecho... si en vez de 10 elementos quieres conseguir, no se, 5.000 millones de números pues ya la cosa cambia ( nota que ya no te valdría el tipo int ).

No se, si tu idea es conseguir una colección de 10 números únicos partiendo de un grupo inicial de 15 números podrías probar a crear primero un array con los 15 números y a sacar 10 números al azar... o también puedes desordenar esa colección de 15 números y quedarte únicamente con los 10 primeros:

Código
  1. const int PopulationSize = 20;
  2. const int ArraySize = 19;
  3.  
  4. int main(){
  5.  
  6.  int population[ PopulationSize ];
  7.  for ( int i=0; i < PopulationSize; i++ )
  8.    population[ i ] = i+1;
  9.  
  10.   int arreglo[ ArraySize ];
  11.  
  12.   srand(time(0));
  13.  
  14.   for(int i = 0; i < PopulationSize; i++)
  15.   {
  16.     int j = rand() % PopulationSize;
  17.  
  18.     if ( i == j )
  19.       j = ( i + 1 ) % PopulationSize;
  20.  
  21.     std::swap( population[i], population[j]);
  22.   }
  23.  
  24.   for ( int i = 0; i < ArraySize; ++i )
  25.   {
  26.     arreglo[ i ] = population[ i ];
  27.     std::cout << arreglo[ i ] << std::endl;
  28.   }
  29.  
  30.   return 0;
  31. }