Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Random implementado en una matriz estatica (https://www.clubdelphi.com/foros/showthread.php?t=77932)

Jusar 07-03-2012 05:28:41

Random implementado en una matriz estatica
 
Saludos desde Costa Rica. Actualmente me encuentro realizando una matriz que almacene numeros aleatorios utilizando el random, todo perfecto hasta aca lo unico es que me gustaria es crearla pero almacenando parejas de numero.

Ejm:

Código Delphi [-]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     int mat[2][2];
     for (int i=0;i<2;i++)
         for (int j=0;j<2;j++)
             mat[i][j]= 0;

     int w=0;
     for (int i=0;i<2;i++)
     {
         for (int j=0;j<2;j++)
         {
             int x = random(0-2);
             for (int a=0;a<2;a++)
             {
                 for (int b=0;b<2;b++)
                 {
                     if ( mat[a][b] == x)
                        w++;
                 }
             }
             if (w<=1)
                mat[i][j]=x;
         }
     }

     Label1->Caption=mat[0][0];
     Label2->Caption=mat[0][1];
     Label3->Caption=mat[1][0];
     Label4->Caption=mat[1][1];

}
//---------------------------------------------------------------------------

ecfisa 07-03-2012 05:50:48

Hola jusar.

Si no entendí mal lo que buscas, creo que podrías hacer:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TSmallPoint Matriz[2][2]; //Si los valores a almacenar son grandes usa TPoint
  randomize();
  /* Cargar */
  for(int f=0; f < 2; f++)
    for(int c=0; c < 2; c++) {
      Matriz[f][c].x = random(2);
      Matriz[f][c].y = random(2);
    }
  /* Mostrar */
  for(int f=0; f < 2; f++)
    for(int c=0; c <2; c++)
      ListBox1->Items->Add(Format("%d %d",
        ARRAYOFCONST((Matriz[f][c].x, Matriz[f][c].y))));
}

Saludos.

Jusar 07-03-2012 07:07:59

Compa de esa manera no si no mas bien realizando una matriz donde me quede algo asi:

Matriz= 0 1 2
2 0 1

Pero con la unica desventaja que ocupo usando random pero no logro hacer que me queden parejas de numeros no se si me explico...

ecfisa 07-03-2012 12:41:43

Hola jusar.
Código:

Matriz= 0 1 2
        2 0 1

Disculpa pero realmente no te entiendo. Según lo que pusiste arriba, se trataría de una matriz de tres columnas por dos filas, no veo donde encaja eso de las parejas de números...

Saludos.

Casimiro Notevi 07-03-2012 12:52:06

Cita:

Empezado por Jusar (Mensaje 427018)
no se si me explico...

Creo que ese es el problema :)

Trata de explicar lo más detalladamente posible todo el proceso de lo que quieres hacer, puede escribir cuanto te apetezca, no hay limitación alguna, ni cobramos por palabras :)

Héctor Randolph 07-03-2012 17:17:02

Divide el proceso en dos etapas:

- Primero llenar la matriz con las parejas de números, es decir, aquí garantizas que cada número se almacena por duplicado.
- Después mezclar los elementos, para esto puedes utilizar random para seleccionar dos posiciones de la matriz y las intercambias. Repites esta acción n veces dependiendo del número de elementos de la matriz. A veces con 50 o 100 ciclos es suficiente.

Al final tendrás parejas de números distribuidas aleatoriamente en la matriz, algo similar al juego de memorama

Jusar 07-03-2012 22:21:02

Exato tal como lo dice Hector yo que ocupo es realizar una matriz con numeros aleatorios para luego puedo utilizar image y cargar imagenes con los numeros almacenados en la matriz por ejemplo:

Matriz:
2 3 1
3 2 1

entonces con le random el cual me sirve para generar numeros aleatorios ocupo que me los genere lo cual ya se pero lo que ocupo es que el genere los numeros pero que me queden los numeros 2 veces repetidos. Todo poder realizar un juego de memoria y poder las cargar imagenes aleatorias y buscar su respectiva pareja. Pero en esta ocacion lo que cuopo es una condicion que haga que la matriz quede con numeros repetidos... espero haberme explicado...

Héctor Randolph 07-03-2012 23:16:35

Ya tienes la respuesta, llena la matriz con los números por parejas. Digamos que llenas la matriz dentro de una sentencia FOR que tendrá n / 2 ciclos, donde n es el número de elementos de la matriz que siempre deberá ser par.

Tomando tu ejemplo la matriz quedaría de esta forma:

1 1 2
2 3 3

Ahora los mezclas en otro ciclo con x repeticiones.

Aquí la idea es tomar dos elementos de la matriz de forma aleatoria digamos [1,1] y [2,2], los intercambias quedando así.


3 1 2
2 1 3

Si esto lo repites muchas veces todos los elementos quedarán en posiciones aleatorias (revueltos).

Saludos

Jusar 07-03-2012 23:36:00

Hasta el momento lo que tengo es esto codigo pero no logro eso siempre me puede generar o tres 1 o tres 0 o cuatros 1 o 0...

Código Delphi [-]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     int mat[2][2];
     for (int i=0;i<2;i++)
         for (int j=0;j<2;j++)
             mat[i][j]= 0;

     int w=0;
     for (int i=0;i<2;i++)
     {
         for (int j=0;j<2;j++)
         {
             int x = random(2);
             for (int a=0;a<2;a++)
             {
                 for (int b=0;b<2;b++)
                 {
                     if ( mat[a][b] == x)
                        w++;
                 }
             }
             if (w<2)
             {
                mat[i][j]=x;
                w=0;
             }
         }
     }

     Label1->Caption=mat[0][0];
     Label2->Caption=mat[0][1];
     Label3->Caption=mat[1][0];
     Label4->Caption=mat[1][1];

}

ecfisa 08-03-2012 18:02:41

Hola Jusar.

Primero que nada felicito a Hector por su poder de interpretación ;)

Entonces, más o menos sería:
Código:

const MAXFIL = 2;
const MAXCOL = MAXFIL+1;

int Matriz[MAXFIL][MAXCOL];

void Cargar(int (*m)[MAXCOL])
{
  for(int f=0; f < MAXFIL; f++)
  for(int c=0; c < MAXCOL; c++) {
      m[c][f] = c+1;
      m[c][f+1] = c+2;
    }
}

void Mezclar(int (*m)[MAXCOL])
{
TSmallPoint a,b;
int tmp;
  for (int i=0; i < 100; i++) {
    a.x = random(MAXCOL);
    b.x = random(MAXCOL);
    a.y = random(MAXFIL);
    b.y = random(MAXFIL);
    tmp = Matriz[a.x][a.y];
    m[a.x][a.y] = m[b.x][b.y];
    m[b.x][b.y] = tmp;
  }
}

void Mostrar(TMemo *M)
{
AnsiString s;
  for(int f=0; f < MAXFIL; f++) {
    s = "";
    for(int c=0; c < MAXCOL; c++)
      s = s + IntToStr(Matriz[c][f])+ ' ';
    M->Lines->Add(s);
  }
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Cargar(Matriz);
 Memo1->Clear();
 Memo1->ScrollBars = ssVertical;
 Memo1->Lines->Add("Estado inicial");
 Memo1->Lines->Add("-----------------");
 Mostrar(Memo1);

}

void __fastcall TForm1::btnShowClick(TObject *Sender)
{
 Mezclar(Matriz);
 Memo1->Lines->Add("-----------------");
 Mostrar(Memo1);
}

Saludos. :)


La franja horaria es GMT +2. Ahora son las 01:20:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi