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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  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,573 veces)
amchacon


Desconectado Desconectado

Mensajes: 1.211



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

Creo que es obvio que se hace en un array temporal >.>
¿Y después lo vuelves a copiar en el array original? :huh:


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 #11 en: 8 Abril 2014, 20:47 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.

Si no te he entendido mal ivancea96, la colocación en el array o.k, lo vas llenando desde cero al final, pero al tomar un elemento aleatorio puede suceder que ya lo hayas tomado, con lo que necesitarías poner un valor flag para indicar que ese elemento ya se ha tomado. En estas circunstancias estarías igual que el método que David8 y yo hemos propuesto como alternativa.

Todo esto si te he entendido bien, vete tu a saber. ;)

Yo casi me quedaría con el método de coger la lista ordenada, como sugirió amchacon, y desordenarla aleatoriamente. por intercambio aleatorio de posiciones un cierto número de veces y listo. Así tenemos controladas las iteracione a realizar.

¡¡¡¡ Saluditos! ..... !!!!




En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Duda función barajar
« Respuesta #12 en: 8 Abril 2014, 21:03 pm »

El caso, es que cada vez que coges un elemento, se reduce el próximo número máximo del rand() en 1. Si un elemento que escoges, ya ha sido cogido, se va al siguiente, así hasta que no haya sido cogido...
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda función barajar
« Respuesta #13 en: 8 Abril 2014, 21:10 pm »

El caso, es que cada vez que coges un elemento, se reduce el próximo número máximo del rand() en 1. Si un elemento que escoges, ya ha sido cogido, se va al siguiente, así hasta que no haya sido cogido...
¿Comor?

¿Y si cojo un elemento del principio? ¿No puede adceder a los finales?

Quiero ver una implementación ^^
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 #14 en: 8 Abril 2014, 21:21 pm »

¿Si coges un elemento del principio? Ese proceso se repite N veces, siendo N el tamaño del array.

EDITO:
Quiero ver una implementación

Código
  1. template<class T>void barajar(vector<T> &v){
  2.    vector<T> t;
  3.    int r=0;
  4.    while(v.size()>0){
  5.        t.push_back(v[r=rand()%v.size()]);
  6.        v.erase(v.begin()+r);
  7.    }
  8.    v = t;
  9. }
Por ejemplo, manejando vectores.
« Última modificación: 8 Abril 2014, 21:54 pm por ivancea96 » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Duda función barajar
« Respuesta #15 en: 8 Abril 2014, 21:51 pm »

¿Comor?

¿Y si cojo un elemento del principio? ¿No puede adceder a los finales?

Quiero ver una implementación ^^

Yo también lo quiero ver.

En el método que propuse, desordenar un cierto número de veces, 10 000 en el caso que propongo, con lo que controlamos las iteraciones, una implementación simple, nada rebuscada, arroja valores por debajo de 0.02s, más cercanos al 0.015s:


Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #define MAX_DESORDEN 10000
  5.  
  6.  
  7. int main (void){
  8.  int mazo[4][13] = {0};
  9.  srand((unsigned) time(NULL));
  10.  int i,j,k=0,x1,y1,x2,y2,temp;
  11.  ///puts("Mazo ordenado:\n");
  12.  for (i=0;i< 4; i++){
  13.    ///puts("\n");
  14.    for (j=0;j<13 ;j++,k++ ){
  15.      mazo[i][j]=k;
  16.      ///printf("%d  ",mazo[i][j]);
  17.    }
  18.   }
  19.  
  20.  for (i=0;i<MAX_DESORDEN;i++){
  21.    x1=rand () %4;
  22.    y1=rand () %13;
  23.    x2=rand () %4;
  24.    y2=rand () %13;
  25.    temp=mazo[x1][y1];
  26.    mazo[x1][y1]=mazo[x2][y2];
  27.    mazo[x2][y2]=temp;
  28.  }
  29.  /** activame para ver el mazo desordenado **/
  30.  /*puts("\n\nMazo desordenado:\n");
  31.   for (i=0;i< 4; i++){
  32.     puts("\n");
  33.     for (j=0;j<13 ;j++,k++ )
  34.       printf("%d  ",mazo[i][j]);
  35.    }*/
  36.   return EXIT_SUCCESS;
  37. }

Salu2!.



« Última modificación: 8 Abril 2014, 21:56 pm por leosansan » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



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

Al parecer ya ha editado su post con la implementación... Pero la propuesta de Ivan no es una solución eficiente (intenta mezclar 10 millones de elementos, a mí me tardó 4 minutos...).

Por cierto Leo, haciendo pruebas me he dado cuenta que hay una forma un poco más sencilla de mezclar. No es necesario definirte una constante con el numero de iteraciones:
Código
  1. for (int i = 0;i < v.size(); i++)
  2.    swap(v[i],v[rand()%A.size()]);

Dicho de otra forma, recorro el array y cada posición la intercambio con otra aleatoria. De esa forma tengo la garantía de tener el array desordenado y no tengo que definir una constante "a ojo".

La función swap no es más que:
Código
  1. void swap(int &a,int &b)
  2. {
  3.    int c = a;
  4.    a = b;
  5.    b = c;
  6. }
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 #17 en: 8 Abril 2014, 23:24 pm »

.................................).

Por cierto Leo, haciendo pruebas me he dado cuenta que hay una forma un poco más sencilla de mezclar. No es necesario definirte una constante con el numero de iteraciones:
...........................................
Dicho de otra forma, recorro el array y cada posición la intercambio con otra aleatoria. De esa forma tengo la garantía de tener el array desordenado y no tengo que definir una constante "a ojo".
......................................

Buena observación amchacon, muy buena  ;-) ;-) ;-)

...Pero me sentiría más tranquilo barajando un par de veces más para evitar las posibles coincidencias de i con el valor obtenido del rand y que existan cartas que acaben quedándose en las mismas posiciones :laugh:

Ya sólo nos queda ponerlo en práctica echándonos unas partiditas de póker ;)

Hay que ver la soluciones, cada vez más optimizadas, que nos salen cuando nos dejan......

Mi adaptación al C de tu idea:


Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4.  
  5. int main (void){
  6.  int mazo[52] = {0};
  7.  srand((unsigned) time(NULL));
  8.  int j,x,temp;
  9.  ///puts("Mazo ordenado:\n");
  10.    for (j=0;j<52 ;j++)
  11.      mazo[j]=j;
  12.    for (j=0;j<52 ;j++){
  13.    x=rand () % 52;
  14.    temp=mazo[j];
  15.    mazo[j]=mazo[x];
  16.    mazo[x]=temp;
  17.  }
  18.  puts("\n\nMazo desordenado:");
  19.    for (j=0;j<52 ;j++ ){
  20.      if (j%13==0)
  21.        puts("\n");
  22.      printf("%d  ",mazo[j]);
  23.    }
  24.   putchar ('\n');
  25.   return EXIT_SUCCESS;
  26. }


Citar


Mazo desordenado:


18  35  24  31  36  46  21  25  37  34  40  23  51

0  47  6  16  7  44  9  22  12  20  33  3  17

50  39  42  13  1  10  27  26  11  29  2  43  45

14  32  48  49  4  8  28  15  38  19  41  5  30



¡¡¡¡ Saluditos! ..... !!!!



 

En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Duda función barajar
« Respuesta #18 en: 9 Abril 2014, 02:00 am »

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.

Acabo ahi despues de que le hicieran la tarea y borrara toda huella para poder presentarla tranquilo  :rolleyes:
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
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,504 Ú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