Generar números aleatorios sin repeticiones.

Iniciado por serg2404, 2 Diciembre 2016, 02:22 AM

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

serg2404

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


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <windows.h>

int tableroNumerico[6][6];// aqui va a estar el tablero numerico original
int tableroNumerico2[6][6];//aqui va a estar el tablero desordenado
char tableroFigura[6][6];//aqui va a estar el tablero con la figura original
char tableroFigura2[6][6];//aqui va a estar el tablero desordenado
int repetidos[34];//este vector es para revisar los numeros repetidos en el rand

int generarNumero(int *c)
{
int numero;
bool distinto=false;

   while(distinto==false)
   {  
       srand(time(NULL));//Cambio el seed con el tiempo de ese momento.
       int cont=0;
       numero=rand()%34+1;
       for(int i=0; i<34; i++)
       {
           if(repetidos[i]==numero)
               cont++;
       }
       if(cont==0)
       {
           distinto=true;
           repetidos[*c]=numero;
       }
           
   }  
return numero;  
}

void llenarTablero(char t)
{
   
   int cont=0;
   int aux=0;  
   if(t=='f')
   {
       
   }
   else
   {
       for(int i=0; i<6; i++)
           {
            for(int j=0; j<6; j++)
            {
               if(i==0 && j==5)
                   tableroNumerico2[i][j]=0;
               else
                   {
                    aux=generarNumero(&cont);
                    tableroNumerico2[i][j]=aux;
                    cont++;  
                   }      
             }
           }    
   }  
}

void mostrarTablero(char t) //Aqui imprimo el tablero despues de cada movimiento
{
   if(t=='f')
   {
       
   }
   else
   {
       for(int i=0; i<6; i++)
           {
            for(int j=0; j<6; j++)
               {
                if(tableroNumerico2[i][j]==0)
                   printf("[  ]");
                 else
                   printf("[ %i ]", tableroNumerico2[i][j]);  
               }  
               printf(" \n");    
           }
   }
}
main()
{
 for (int i=0; i<35; i++)
   repetidos[i]=0;
 char tipoTablero='n';
 llenarTablero(tipoTablero) ;
 mostrarTablero(tipoTablero);
 system("pause");
}


xustyx

No se exactamente que es lo que quieres, pero ... ¿Por que no inicias la matriz con los números ordenados y luego la desordenas?

serg2404

Cita de: 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?

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.

xustyx

#3
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.

serg2404

Cita de: 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.

Ok, gracias! Intentare eso.

0xFer

#5
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 (cpp) [Seleccionar]
for (int i=0; i<35; i++)
   repetidos[i]=0;


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

Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

serg2404

Cita de: 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 (cpp) [Seleccionar]
for (int i=0; i<35; i++)
   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  :( :( .

0xFer

Bueno entonces te corrijo el código:  ;-)

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <windows.h>

int tableroNumerico[6][6];// aqui va a estar el tablero numerico original
int tableroNumerico2[6][6];//aqui va a estar el tablero desordenado
char tableroFigura[6][6];//aqui va a estar el tablero con la figura original
char tableroFigura2[6][6];//aqui va a estar el tablero desordenado
int repetidos[36];//este vector es para revisar los numeros repetidos en el rand

int generarNumero(int *c)
{
int numero;
bool distinto=false;

    while(distinto==false)
    { 
         
        int cont=0;
        numero=rand()%35+1;
       
        for(int i=0; i<36; i++)
        {
            if(repetidos[i]==numero)
                cont++;
        }
        if(cont==0)
        {
            distinto=true;
            repetidos[*c]=numero;
        }

    }   
return numero;   
}

void llenarTablero(char t)
{

    int cont=0;
    int aux=0; 
    if(t=='f')
    {

    }
    else
    {
        for(int i=0; i<6; i++)
            {
             for(int j=0; j<6; j++)
             {
                if(i==0 && j==5){

                    tableroNumerico2[i][j]=0;
                    repetidos[i*j] = 0;
                }
                else
                    {
                     aux=generarNumero(&cont);
                     tableroNumerico2[i][j]=aux;
                    }
                cont++;       
              }
            }   
    }   
}

void mostrarTablero(char t) //Aqui imprimo el tablero despues de cada movimiento
{
    if(t=='f')
    {

    }
    else
    {
        for(int i=0; i<6; i++)
            {
             for(int j=0; j<6; j++)
                {
                 if(tableroNumerico2[i][j]==0)
                    printf("[  ]");
                  else
                    printf("[ %i ]", tableroNumerico2[i][j]);   
                } 
                printf(" \n");     
            }
    }
}
main()
{

srand(time(NULL));//Cambio el seed con el tiempo de ese momento.
  for (int i=0; i<36; i++)
    repetidos[i] = 999;    //cualquier numero que este fuera del intervalo  [0 - 35]
   
  char tipoTablero='n';
  llenarTablero(tipoTablero) ;
  mostrarTablero(tipoTablero);
  system("pause");
}
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

serg2404

Cita de: 0xFer en  2 Diciembre 2016, 05:08 AM
Bueno entonces te corrijo el código:  ;-)

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <windows.h>

int tableroNumerico[6][6];// aqui va a estar el tablero numerico original
int tableroNumerico2[6][6];//aqui va a estar el tablero desordenado
char tableroFigura[6][6];//aqui va a estar el tablero con la figura original
char tableroFigura2[6][6];//aqui va a estar el tablero desordenado
int repetidos[36];//este vector es para revisar los numeros repetidos en el rand

int generarNumero(int *c)
{
int numero;
bool distinto=false;

    while(distinto==false)
    { 
         
        int cont=0;
        numero=rand()%35+1;
       
        for(int i=0; i<36; i++)
        {
            if(repetidos[i]==numero)
                cont++;
        }
        if(cont==0)
        {
            distinto=true;
            repetidos[*c]=numero;
        }

    }   
return numero;   
}

void llenarTablero(char t)
{

    int cont=0;
    int aux=0; 
    if(t=='f')
    {

    }
    else
    {
        for(int i=0; i<6; i++)
            {
             for(int j=0; j<6; j++)
             {
                if(i==0 && j==5){

                    tableroNumerico2[i][j]=0;
                    repetidos[i*j] = 0;
                }
                else
                    {
                     aux=generarNumero(&cont);
                     tableroNumerico2[i][j]=aux;
                    }
                cont++;       
              }
            }   
    }   
}

void mostrarTablero(char t) //Aqui imprimo el tablero despues de cada movimiento
{
    if(t=='f')
    {

    }
    else
    {
        for(int i=0; i<6; i++)
            {
             for(int j=0; j<6; j++)
                {
                 if(tableroNumerico2[i][j]==0)
                    printf("[  ]");
                  else
                    printf("[ %i ]", tableroNumerico2[i][j]);   
                } 
                printf(" \n");     
            }
    }
}
main()
{

srand(time(NULL));//Cambio el seed con el tiempo de ese momento.
  for (int i=0; i<36; i++)
    repetidos[i] = 999;    //cualquier numero que este fuera del intervalo  [0 - 35]
   
  char tipoTablero='n';
  llenarTablero(tipoTablero) ;
  mostrarTablero(tipoTablero);
  system("pause");
}

Mil gracias, no lograba salir de este problemita jajaja :D :D ;-)