Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 18 Septiembre 2014, 00:40 am



Título: Generar 6 números y ordenarlos en el mismo bucle(lenguaje C)
Publicado por: NOB2014 en 18 Septiembre 2014, 00:40 am
Hola a todos.
El asunto es simple por lo menos para explicarlo, sólo que no se si se puede hacer, lo que quisiera saber es si en cada iteración además de generar los número ir ordenándolos, me parece que no quedaría del todo ordenado pero por lo menos ir intercambiando los posibles.-
El juego es de Argentina y se llama Quini6, los números a asertar son 6 y van del 0 al 45.-
En este caso no tiene mucho sentido porque el bucle se realiza sólo 6 veces, pero en el caso de generar por ejemplo 500.000 números tal vez acelere el tiempo que tardaría una manera y la otra.-
Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4.  
  5. void generar();
  6.  
  7. int main(void){
  8. generar();
  9.  
  10. return 0;
  11. }
  12.  
  13. void generar(){
  14. int guardar[6], numero=0, i=0, hora = time(NULL);
  15. srand(hora);
  16.  
  17. for(; i<6; i++){
  18. numero = rand()%46;
  19. guardar[i] = numero;
  20. }
  21. }
   


Desde ya muchas gracias y muchos saludos.-
Daniel


Título: Re: Generar 6 números y ordenarlos en el mismo bucle(lenguaje C)
Publicado por: Blaster en 18 Septiembre 2014, 02:25 am
Haciendo uso de qsort podríamos ir ordenando sucesivamente los elementos generados, mas o menos así :

Código
  1. int comparar(const void * x, const void * y)
  2. {
  3.    return ( *(int*)x - *(int*)y );
  4. }
  5.  
  6. void generar(void)
  7. {
  8.    int guardar[6], numero = 0;
  9.    int i, hora = time(NULL);
  10.  
  11.    srand(hora);
  12.  
  13.    for (i = 0; i <= 6; i++)
  14.    {
  15.        numero = rand() % 46;
  16.  
  17.        guardar[i] = numero;
  18.  
  19.        qsort(guardar, i, sizeof(int), comparar);
  20.    }
  21. }
  22.  

Un Saludo


Título: Re: Generar 6 números y ordenarlos en el mismo bucle(lenguaje C)
Publicado por: rir3760 en 18 Septiembre 2014, 03:56 am
lo que quisiera saber es si en cada iteración además de generar los número ir ordenándolos
No es necesario ordenarlos después de cada iteración, puedes hacerlo una vez generados todos los números (ya tienes un ejemplo del uso de qsort cortesía de Blaster).

Lo que si debes hacer es verificar que los números no se repitan, para ello lo mas sencillo es generar primero los cuarenta y seis números almacenándolos en un array y a continuación seleccionar seis aleatoriamente, por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. #define MAX_ELEM  46
  6.  
  7. int main(void)
  8. {
  9.   int num[MAX_ELEM];
  10.   int num_elem = sizeof num / sizeof num[0];
  11.   int i;
  12.   int j;
  13.  
  14.   srand((unsigned) time(NULL));
  15.  
  16.   for (i = 0; i < MAX_ELEM; i++)
  17.      num[i] = i;
  18.  
  19.   for (i = 0; i < 6; i++){
  20.      j = rand() % num_elem;
  21.      printf("%2d\n", num[j]);
  22.  
  23.      num[j] = num[--num_elem];
  24.   }
  25.  
  26.   return EXIT_SUCCESS;
  27. }

Un saludo


Título: Re: Generar 6 números y ordenarlos en el mismo bucle(lenguaje C)
Publicado por: NOB2014 en 18 Septiembre 2014, 16:51 pm
Hola Blaster.
Muchas gracias por el aporte, funciona perfecto sólo que mi idea es ir intercambiando los números según corresponda y se vallan generando.-
Por ejemplo si guardar[0] es mayor a guardar[1] intercambiar a partir de la segunda iteración hasta finalizar, lo estoy intentando voy a ver cómo queda al finalizar el bucle, reitero no cambia el tiempo al hacerlo con 6 iteraciones, quiero experimentar con 500.000.-
Rir muy importante tú código me solucionó lo de los número repetidos, que era algo que tenía pendiente, lo voy a recorrer paso a paso para aprender algunas líneas que no me quedan claras.-   

Saludos.
Daniel   


Título: Re: Generar 6 números y ordenarlos en el mismo bucle(lenguaje C)
Publicado por: rir3760 en 18 Septiembre 2014, 17:30 pm
mi idea es ir intercambiando los números según corresponda y se vallan generando.-
Por ejemplo si guardar[0] es mayor a guardar[1] intercambiar a partir de la segunda iteración hasta finalizar
No deberías hacerlo porque en el mejor escenario terminaras implementando el método de ordenacion por inserción y este tiene una eficiencia menor que Quicksort, mejor ordena la lista una vez hayas generado todos los valores.

Un saludo