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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda función barajar
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Duda función barajar  (Leído 7,574 veces)
David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Duda función barajar
« en: 8 Abril 2014, 15:45 pm »

Hola, tengo el siguiente fragmento de programa:
Código:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void baraja( int wMazo[][13] );
// código

int main (void)
{
   //código
   int mazo[4][13] = {0};
   srand(time(0));
   baraja(mazo);
   //código
   return EXIT_SUCCESS;
}

void baraja( int wMazo[][13] )
{
   int fila;
   int columna;
   int carta;

   for(carta=1; carta<=52; carta++){
      do{
         fila = rand() % 4;
         columna = rand() % 13;
      } while(wMazo[fila][columna] != 0);
      wMazo[fila][columna] = carta;
   }
}

No entiendo porqué se pasa wMazo[][13], es decir, porque se deja el primer corchete sin datos, ¿no debería ser wMazo[4][13] ?

Gracias.


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda función barajar
« Respuesta #1 en: 8 Abril 2014, 16:02 pm »

Esa funcion da problemas, es muy probable que el mazo generado tenga 2 cartas identicas.

Lo ideal esque generes el mazo ordenado y luego hagas intercambios aleatorios.

En cuanto a la pregunta, el primer corchete es opcional. Puedes ponerlo o no, el segundo corchete es necesario para que el compilador traduzca los dos [][] en uno solo.


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda función barajar
« Respuesta #2 en: 8 Abril 2014, 16:22 pm »

Como dice amchacon, tu código genera cartas repetidas ( por mera cuestión de estadística es más probable el caso en el que mazo tiene cartas repetidas que el caso en el que todas la cartas son distintas ).

La solución a ese problema pasaría por crear primero un mazo ordenado, lo cual es fácil de generar, y después mezclarlo mediante una serie de permutaciones ( generar un par X, Y e intercambiar sus cartas ). El número de permutaciones necesarias para asegurar una mezcla adecuada variará en función del algoritmo que elijas.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda función barajar
« Respuesta #3 en: 8 Abril 2014, 17:29 pm »

No entiendo porqué se pasa wMazo[][13], es decir, porque se deja el primer corchete sin datos, ¿no debería ser wMazo[4][13]?
Puedes declararla así pero no tendrá efecto ya que en C cuando un argumento es de tipo array lo que recibe la función es la dirección en memoria de (un puntero a) su primer elemento. Si el array es de tipo "T [N]" la función recibe un puntero de tipo "T *".

Utilizando tu caso como ejemplo la función la puedes declarar en cualquiera de las dos formas:
Código
  1. void baraja( int wMazo[4][13] );
  2.  
  3. /* O tambien */
  4. void baraja( int wMazo[][13] );
Pero no importa ya que la función se procesa como si su declaración fuera (y es):
Código
  1. void baraja(int (*wMazo)[13]);

Esa funcion da problemas, es muy probable que el mazo generado tenga 2 cartas identicas.
En buen plan: lo reviso con cuidado y no veo como se pueda duplicar una carta. ¿Se me escapa algo?

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda función barajar
« Respuesta #4 en: 8 Abril 2014, 17:32 pm »

Cierto. Vi los random y me cegué jejejeje.

El problema es que llegar a tardar un tiempo infinito en mezclar el mazo.... si una de las combinaciones (fila, columna) no se da hasta pasadas miles de iteraciones... pues ahí que te quedas esperando.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda función barajar
« Respuesta #5 en: 8 Abril 2014, 18:20 pm »

Tienes razón Rir, que fallo más tonto :-X

De todas formas, no me gusta ese modo de barajar como ya dije. Me parece mas natural de este modo:

1º Te generas el mazo ordenado.
2º Coges dos elementos al azar y los intercambias
3º Repites el paso 2 tantas veces como creas necesario. Para un mazo tienes de sobra con 1000 iteraciones.

De hecho en C++ (que no C) puedes hacer los dos ultimos pasos en un sola función:
http://www.cplusplus.com/reference/algorithm/random_shuffle/
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Duda función barajar
« Respuesta #6 en: 8 Abril 2014, 19:43 pm »

..........................................................
El problema es que llegar a tardar un tiempo infinito en mezclar el mazo.... si una de las combinaciones (fila, columna) no se da hasta pasadas miles de iteraciones... pues ahí que te quedas esperando.

Creo que últimamente menospreciamos la potencia de proceso de nuestros PC.

Como media a mi me tarda menos de 0.020s.

Ya hace un tiempo hubo una discusión acerca de cuánto tiempo se emplearía en rellenar, con el mismo método, una matriz 10x10 con números del 1 al 1000 y andaba por los 0.012s y acabó en este otro tema.

Salu2!.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Duda función barajar
« Respuesta #7 en: 8 Abril 2014, 19:49 pm »

Para barajar, yo lo que hago es ir cogiendo elementos, e ir colocándolos en un array en posiciones aleatorias.

O lo que es lo mismo, ir cogiendo elementos aleatorios, e ir introduciéndolos en el array.
Así para barajar en un tiempo finito.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda función barajar
« Respuesta #8 en: 8 Abril 2014, 20:41 pm »

Para barajar, yo lo que hago es ir cogiendo elementos, e ir colocándolos en un array en posiciones aleatorias.

O lo que es lo mismo, ir cogiendo elementos aleatorios, e ir introduciéndolos en el array.
Así para barajar en un tiempo finito.
Pero estás duplicando el array así... Para eso intercambias y ya esta.

Creo que últimamente menospreciamos la potencia de proceso de nuestros PC.

Como media a mi me tarda menos de 0.020s.

Ya hace un tiempo hubo una discusión acerca de cuánto tiempo se emplearía en rellenar, con el mismo método, una matriz 10x10 con números del 1 al 1000 y andaba por los 0.012s y acabó en este otro tema.

Salu2!.

Por supuesto, pero siempre se busca la máxima eficiencia.

Suponte un servidor de poker con millones de usuarios, dado que tienes que hacer millones de mezclas conviene perder el menor tiempo posible.

Y confiar en el "azar" no suele ser muy buena práctica. Es una buena costumbre garantizar que el algoritmo termine en tiempo finito incluso en el peor caso posible, nos ayudará a evitarnos algunos errores "oscuros".

Como curiosidad de algoritmos basados en el azar, tenemos un algoritmo de ordenación que usa una técnica similar: El bogosort (o stupidsort). Que viene a ser el siguiente:

Dado un conjunto de números desordenados:
     1º Comprobar que esten ordenados, si lo estan termina.
     2º Mezclar los numeros aleatoriamente.

Y aquí una implementación de este algoritmo en C++:

Código
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <ctime>
  4. #include <iterator>
  5. using namespace std;
  6.  
  7. void bogo_sort(vector<int>&);
  8.  
  9. int main()
  10. {
  11.    vector<int> Numeros;
  12.    srand(time(NULL));
  13.    int N;
  14.  
  15.    cout<<"Introduzca numero de elementos a ordenar: ";
  16.    cin>>N;
  17.  
  18.    Numeros.resize(N);
  19.  
  20.    for (int i = 0; i < 10;i++) // 10 intentos
  21.    {
  22.        generate(Numeros.begin(),Numeros.end(),rand); // relleno el vector de numeros aleatorios
  23.  
  24.          // Muestra los numeros generados por pantalla:
  25. //        copy(Numeros.begin(),Numeros.end(), ostream_iterator<int>(cout, " "));
  26.  
  27.        time_t inicio = clock();
  28.  
  29.        bogo_sort(Numeros);
  30.  
  31.        time_t fin = clock();
  32.  
  33.        cout<<(double)(fin-inicio)/(CLOCKS_PER_SEC)<<"s en ordenar "<<N<<" elementos"<<endl;
  34.  
  35.        // muestra los numeros ordenados por pantalla
  36. //        copy(Numeros.begin(),Numeros.end(), ostream_iterator<int>(cout, " "));
  37.  
  38.       // cout<<endl;
  39.    }
  40.    return 0;
  41. }
  42.  
  43. bool enOrden(vector<int> &x) {return adjacent_find(x.begin(), x.end(), greater<int>()) == x.end();}
  44.  
  45. void bogo_sort(vector<int> &Numeros)
  46. {
  47.    while (!enOrden(Numeros))
  48.    {
  49.        random_shuffle(Numeros.begin(),Numeros.end());
  50.    }
  51. }
  52.  

Dile que genere 10 elementos. A mí los tiempos me salen muy dispares (desde 0,063 hasta 5 segundos). Eso en rangos pequeños, cuanto mayor sea el rango, mayor será la dispersión.

En resumen, trabajar basado en la suerte nos da unos programas muy impredecibles y inestables. A mí personalmente no me gusta nada ;D
« Última modificación: 8 Abril 2014, 20:47 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Duda función barajar
« Respuesta #9 en: 8 Abril 2014, 20:43 pm »

Pero estás duplicando el array así... No sé.

Creo que es obvio que se hace en un array temporal >.>
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con funcion dentro de funcion en un echo
PHP
N4X 6 5,864 Último mensaje 21 Enero 2010, 18:12 pm
por N4X
Duda con funcion
PHP
octavioxd 8 3,505 Último mensaje 9 Febrero 2010, 12:29 pm
por N4X
[Duda]funcion en POO
PHP
rolly21102 2 2,738 Último mensaje 1 Julio 2010, 05:51 am
por rolly21102
Duda con funcion<...>
Programación C/C++
_niu 3 1,986 Último mensaje 26 Enero 2012, 03:02 am
por BlackZeroX
Código para barajar cartas en Java.
Java
JesusIII 1 8,237 Último mensaje 17 Noviembre 2015, 20:37 pm
por DarK_FirefoX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines