elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Generar números aleatorios sin repeticiones.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Generar números aleatorios sin repeticiones.  (Leído 3,531 veces)
serg2404

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Generar números aleatorios sin repeticiones.
« 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. }


« Última modificación: 2 Diciembre 2016, 02:28 am por serg2404 » En línea

xustyx

Desconectado Desconectado

Mensajes: 213


Ver Perfil
Re: Generar números aleatorios sin repeticiones.
« Respuesta #1 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?


En línea

serg2404

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Generar números aleatorios sin repeticiones.
« Respuesta #2 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.
En línea

xustyx

Desconectado Desconectado

Mensajes: 213


Ver Perfil
Re: Generar números aleatorios sin repeticiones.
« Respuesta #3 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.
« Última modificación: 2 Diciembre 2016, 02:49 am por xustyx » En línea

serg2404

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Generar números aleatorios sin repeticiones.
« Respuesta #4 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.
En línea

0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: Generar números aleatorios sin repeticiones.
« Respuesta #5 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:

« Última modificación: 2 Diciembre 2016, 03:45 am por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
serg2404

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Generar números aleatorios sin repeticiones.
« Respuesta #6 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  :( :( .
En línea

0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: Generar números aleatorios sin repeticiones.
« Respuesta #7 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.  
En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
serg2404

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Generar números aleatorios sin repeticiones.
« Respuesta #8 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 ;-)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Generar numeros aleatorios sin repeticion[C]
Programación C/C++
HRSLASH 2 25,335 Último mensaje 28 Diciembre 2010, 06:58 am
por von Newman
Generar números aleatorios sin que se repitan ... en C++
Programación C/C++
drawiz 4 27,988 Último mensaje 17 Octubre 2019, 07:46 am
por Mecanma
Programa para generar numeros aleatorios
Programación C/C++
pedrokuellar 8 8,254 Último mensaje 24 Octubre 2011, 22:37 pm
por s00rk
Como generar numeros aleatorios pares?
Programación C/C++
lucas59 4 14,164 Último mensaje 1 Octubre 2014, 18:12 pm
por Shout
Generar numeros aleatorios sin que se repitan
Programación C/C++
Mecanma 1 3,845 Último mensaje 17 Octubre 2019, 06:28 am
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines