Programa que genera números aleatorios sin repetir en C++

Iniciado por UmbraNoche, 21 Enero 2015, 01:27 AM

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

UmbraNoche

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 (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main(){

    int arreglo[10];
    int aux = 0;

    srand(time(0));

    for(int i = 0; i < 10; i++){
        aux = (1 + rand() % 15);

        int aux2 = 0;

        while(aux2 < i){

            if(aux != arreglo[aux2])
                aux2++;

            else{
                    aux = (1 + rand() % 15);
                    aux2 = 0;

                }
        }

        arreglo[i] = aux;

        cout << arreglo[i] << "\n";
    }

    return 0;
}
"Si tienes un sueño entonces aferrate a el con constancia, sacrificio y dedicación".

sabeeee

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:.
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

eferion

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 (cpp) [Seleccionar]
const int PopulationSize = 20;
const int ArraySize = 19;

int main(){

  int population[ PopulationSize ];
  for ( int i=0; i < PopulationSize; i++ )
    population[ i ] = i+1;

   int arreglo[ ArraySize ];

   srand(time(0));

   for(int i = 0; i < PopulationSize; i++)
   {
     int j = rand() % PopulationSize;

     if ( i == j )
       j = ( i + 1 ) % PopulationSize;

     std::swap( population[i], population[j]);
   }

   for ( int i = 0; i < ArraySize; ++i )
   {
     arreglo[ i ] = population[ i ];
     std::cout << arreglo[ i ] << std::endl;
   }

   return 0;
}