Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: serg2404 en 2 Diciembre 2016, 02:22 am



Título: Generar números aleatorios sin repeticiones.
Publicado por: serg2404 en 2 Diciembre 2016, 02:22 am
tengo este código para generar números aleatorios sin que se repitan y guardarlos en una matriz, creo que se me queda en un loop infinito y no logro ver porque, he tratado de generar los números sin que se repitan de varias maneras y no lo logro, ayuda!!
(el codigo esta incompleto, extraje la parte en la que necesito ayuda)
Gracias :D

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <ctype.h>
  5. #include <windows.h>
  6.  
  7. int tableroNumerico[6][6];// aqui va a estar el tablero numerico original
  8. int tableroNumerico2[6][6];//aqui va a estar el tablero desordenado
  9. char tableroFigura[6][6];//aqui va a estar el tablero con la figura original
  10. char tableroFigura2[6][6];//aqui va a estar el tablero desordenado
  11. int repetidos[34];//este vector es para revisar los numeros repetidos en el rand
  12.  
  13. int generarNumero(int *c)
  14. {
  15. int numero;
  16. bool distinto=false;
  17.  
  18.    while(distinto==false)
  19.    {  
  20.        srand(time(NULL));//Cambio el seed con el tiempo de ese momento.
  21.        int cont=0;
  22.        numero=rand()%34+1;
  23.        for(int i=0; i<34; i++)
  24.        {
  25.            if(repetidos[i]==numero)
  26.                cont++;
  27.        }
  28.        if(cont==0)
  29.        {
  30.            distinto=true;
  31.            repetidos[*c]=numero;
  32.        }
  33.  
  34.    }  
  35. return numero;  
  36. }
  37.  
  38. void llenarTablero(char t)
  39. {
  40.  
  41.    int cont=0;
  42.    int aux=0;  
  43.    if(t=='f')
  44.    {
  45.  
  46.    }
  47.    else
  48.    {
  49.        for(int i=0; i<6; i++)
  50.            {
  51.             for(int j=0; j<6; j++)
  52.             {
  53.                if(i==0 && j==5)
  54.                    tableroNumerico2[i][j]=0;
  55.                else
  56.                    {
  57.                     aux=generarNumero(&cont);
  58.                     tableroNumerico2[i][j]=aux;
  59.                     cont++;  
  60.                    }      
  61.              }
  62.            }    
  63.    }  
  64. }
  65.  
  66. void mostrarTablero(char t) //Aqui imprimo el tablero despues de cada movimiento
  67. {
  68.    if(t=='f')
  69.    {
  70.  
  71.    }
  72.    else
  73.    {
  74.        for(int i=0; i<6; i++)
  75.            {
  76.             for(int j=0; j<6; j++)
  77.                {
  78.                 if(tableroNumerico2[i][j]==0)
  79.                    printf("[  ]");
  80.                  else
  81.                    printf("[ %i ]", tableroNumerico2[i][j]);  
  82.                }  
  83.                printf(" \n");    
  84.            }
  85.    }
  86. }
  87. main()
  88. {
  89.  for (int i=0; i<35; i++)
  90.    repetidos[i]=0;
  91.  char tipoTablero='n';
  92.  llenarTablero(tipoTablero) ;
  93.  mostrarTablero(tipoTablero);
  94.  system("pause");
  95. }


Título: Re: Generar números aleatorios sin repeticiones.
Publicado por: xustyx en 2 Diciembre 2016, 02:36 am
No se exactamente que es lo que quieres, pero ... ¿Por que no inicias la matriz con los números ordenados y luego la desordenas?


Título: Re: Generar números aleatorios sin repeticiones.
Publicado por: serg2404 en 2 Diciembre 2016, 02:39 am
No se exactamente que es lo que quieres, pero ... ¿Por que no inicias la matriz con los números ordenados y luego la desordenas?

Lo que quiero es tener los números del 1 al 35 ordenados en la matriz, necesito que sea random ya que es para un juego y cada ves que se juegue debe empezar de manera distinta, no se si eso lo pueda hacer desordenando la matriz.


Título: Re: Generar números aleatorios sin repeticiones.
Publicado por: xustyx en 2 Diciembre 2016, 02:46 am
Entonces genera una matriz ordenada y luego desordenala. Será mas fácil.

Edito:
Crea un vector de tamaño 36 con valores de 0 a 35, desordenalo y luego lo transformas a la matriz.


Título: Re: Generar números aleatorios sin repeticiones.
Publicado por: serg2404 en 2 Diciembre 2016, 02:50 am
Entonces genera una matriz ordenada y luego desordenala. Será mas fácil.

Edito:
Crea un vector de tamaño 36 con valores de 0 a 35, desordenalo y luego lo transformas a la matriz.

Ok, gracias! Intentare eso.


Título: Re: Generar números aleatorios sin repeticiones.
Publicado por: 0xFer en 2 Diciembre 2016, 03:43 am
Debes hacer que el método srand se ejecute solo una vez al principio del programa en el método main, ahí en dónde lo pusiste hace que el número aleatorio generado se repita varias veces; 23 23 23 23 23 11 11 11 11 33 33 33 33.

Otro detalles es que generas un número aleatorio de 34 posibles, y como tienes una matriz de 36 elementos es normal que falte 2 números más para que se pueda llenar la matriz sin que ninguno se repita.

Cuidado con esto:

Código
  1. for (int i=0; i<35; i++)
  2.    repetidos[i]=0;

Te estás pasando del tamaño del vector  :silbar:



Título: Re: Generar números aleatorios sin repeticiones.
Publicado por: serg2404 en 2 Diciembre 2016, 04:52 am
Debes hacer que el método srand se ejecute solo una vez al principio del programa en el método main, ahí en dónde lo pusiste hace que el número aleatorio generado se repita varias veces; 23 23 23 23 23 11 11 11 11 33 33 33 33.

Otro detalles es que generas un número aleatorio de 34 posibles, y como tienes una matriz de 36 elementos es normal que falte 2 números más para que se pueda llenar la matriz sin que ninguno se repita.

Cuidado con esto:

Código
  1. for (int i=0; i<35; i++)
  2.    repetidos[i]=0;

Te estás pasando del tamaño del vector  :silbar:


Ok, cambie el srand al main, lleno manualmente uno de los espacios con 0(necesito que este en ese espacio especifico) entonces me quedan 35 números por arreglar, cambie el vector repetidos a uno de 35 espacios y aun me da un bucle  :( :( .


Título: Re: Generar números aleatorios sin repeticiones.
Publicado por: 0xFer en 2 Diciembre 2016, 05:08 am
Bueno entonces te corrijo el código:  ;-)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <ctype.h>
  5. #include <windows.h>
  6.  
  7. int tableroNumerico[6][6];// aqui va a estar el tablero numerico original
  8. int tableroNumerico2[6][6];//aqui va a estar el tablero desordenado
  9. char tableroFigura[6][6];//aqui va a estar el tablero con la figura original
  10. char tableroFigura2[6][6];//aqui va a estar el tablero desordenado
  11. int repetidos[36];//este vector es para revisar los numeros repetidos en el rand
  12.  
  13. int generarNumero(int *c)
  14. {
  15. int numero;
  16. bool distinto=false;
  17.  
  18.    while(distinto==false)
  19.    {  
  20.  
  21.        int cont=0;
  22.        numero=rand()%35+1;
  23.  
  24.        for(int i=0; i<36; i++)
  25.        {
  26.            if(repetidos[i]==numero)
  27.                cont++;
  28.        }
  29.        if(cont==0)
  30.        {
  31.            distinto=true;
  32.            repetidos[*c]=numero;
  33.        }
  34.  
  35.    }  
  36. return numero;  
  37. }
  38.  
  39. void llenarTablero(char t)
  40. {
  41.  
  42.    int cont=0;
  43.    int aux=0;  
  44.    if(t=='f')
  45.    {
  46.  
  47.    }
  48.    else
  49.    {
  50.        for(int i=0; i<6; i++)
  51.            {
  52.             for(int j=0; j<6; j++)
  53.             {
  54.                if(i==0 && j==5){
  55.  
  56.                    tableroNumerico2[i][j]=0;
  57.                    repetidos[i*j] = 0;
  58.                }
  59.                else
  60.                    {
  61.                     aux=generarNumero(&cont);
  62.                     tableroNumerico2[i][j]=aux;
  63.                    }
  64.                cont++;        
  65.              }
  66.            }    
  67.    }  
  68. }
  69.  
  70. void mostrarTablero(char t) //Aqui imprimo el tablero despues de cada movimiento
  71. {
  72.    if(t=='f')
  73.    {
  74.  
  75.    }
  76.    else
  77.    {
  78.        for(int i=0; i<6; i++)
  79.            {
  80.             for(int j=0; j<6; j++)
  81.                {
  82.                 if(tableroNumerico2[i][j]==0)
  83.                    printf("[  ]");
  84.                  else
  85.                    printf("[ %i ]", tableroNumerico2[i][j]);  
  86.                }  
  87.                printf(" \n");    
  88.            }
  89.    }
  90. }
  91. main()
  92. {
  93.  
  94. srand(time(NULL));//Cambio el seed con el tiempo de ese momento.
  95.  for (int i=0; i<36; i++)
  96.    repetidos[i] = 999;    //cualquier numero que este fuera del intervalo  [0 - 35]
  97.  
  98.  char tipoTablero='n';
  99.  llenarTablero(tipoTablero) ;
  100.  mostrarTablero(tipoTablero);
  101.  system("pause");
  102. }
  103.  


Título: Re: Generar números aleatorios sin repeticiones.
Publicado por: serg2404 en 2 Diciembre 2016, 05:13 am
Bueno entonces te corrijo el código:  ;-)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <ctype.h>
  5. #include <windows.h>
  6.  
  7. int tableroNumerico[6][6];// aqui va a estar el tablero numerico original
  8. int tableroNumerico2[6][6];//aqui va a estar el tablero desordenado
  9. char tableroFigura[6][6];//aqui va a estar el tablero con la figura original
  10. char tableroFigura2[6][6];//aqui va a estar el tablero desordenado
  11. int repetidos[36];//este vector es para revisar los numeros repetidos en el rand
  12.  
  13. int generarNumero(int *c)
  14. {
  15. int numero;
  16. bool distinto=false;
  17.  
  18.    while(distinto==false)
  19.    {  
  20.  
  21.        int cont=0;
  22.        numero=rand()%35+1;
  23.  
  24.        for(int i=0; i<36; i++)
  25.        {
  26.            if(repetidos[i]==numero)
  27.                cont++;
  28.        }
  29.        if(cont==0)
  30.        {
  31.            distinto=true;
  32.            repetidos[*c]=numero;
  33.        }
  34.  
  35.    }  
  36. return numero;  
  37. }
  38.  
  39. void llenarTablero(char t)
  40. {
  41.  
  42.    int cont=0;
  43.    int aux=0;  
  44.    if(t=='f')
  45.    {
  46.  
  47.    }
  48.    else
  49.    {
  50.        for(int i=0; i<6; i++)
  51.            {
  52.             for(int j=0; j<6; j++)
  53.             {
  54.                if(i==0 && j==5){
  55.  
  56.                    tableroNumerico2[i][j]=0;
  57.                    repetidos[i*j] = 0;
  58.                }
  59.                else
  60.                    {
  61.                     aux=generarNumero(&cont);
  62.                     tableroNumerico2[i][j]=aux;
  63.                    }
  64.                cont++;        
  65.              }
  66.            }    
  67.    }  
  68. }
  69.  
  70. void mostrarTablero(char t) //Aqui imprimo el tablero despues de cada movimiento
  71. {
  72.    if(t=='f')
  73.    {
  74.  
  75.    }
  76.    else
  77.    {
  78.        for(int i=0; i<6; i++)
  79.            {
  80.             for(int j=0; j<6; j++)
  81.                {
  82.                 if(tableroNumerico2[i][j]==0)
  83.                    printf("[  ]");
  84.                  else
  85.                    printf("[ %i ]", tableroNumerico2[i][j]);  
  86.                }  
  87.                printf(" \n");    
  88.            }
  89.    }
  90. }
  91. main()
  92. {
  93.  
  94. srand(time(NULL));//Cambio el seed con el tiempo de ese momento.
  95.  for (int i=0; i<36; i++)
  96.    repetidos[i] = 999;    //cualquier numero que este fuera del intervalo  [0 - 35]
  97.  
  98.  char tipoTablero='n';
  99.  llenarTablero(tipoTablero) ;
  100.  mostrarTablero(tipoTablero);
  101.  system("pause");
  102. }
  103.  
Mil gracias, no lograba salir de este problemita jajaja :D :D ;-)