Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Yugget en 8 Marzo 2014, 13:59 pm



Título: [SOLUCIONADO] Generar nombre aleatorio.
Publicado por: Yugget en 8 Marzo 2014, 13:59 pm
Hola, muy buenas.

Estoy recién aprendiendo c++, y tengo un problema con un mini-juego por así llamarlo.

El problema es que no sé cómo hacer que se genere un nombre aleatorio.
Por ejemplo tengo: Tomás,Antonio,Juan y quiero que cada vez que inicie el programa se muestre uno de esos nombres aleatoriamente... estoy probando con rand() pero no me da resultado y estaba buscando información pero no logro encontrarlo... y si ustedes me pudieran echar una mano lo agradecería.

El código:

Código
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <math.h>
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.    string num;
  10.    cout << "Introduce un numero: " << endl;
  11.    cin >> num;
  12.  
  13.    char *a[] = { "tijeras", "piedra", "papel" };
  14.  
  15.    if(num == "tijeras")
  16.    {
  17.        cout << "tijeritas" << endl;
  18.    }
  19.    else if(num == "piedra")
  20.    {
  21.        cout << "piedrita" << endl;
  22.    }
  23.    else if(num == "papel")
  24.    {
  25.        cout << "papelin" << endl;
  26.    }  
  27.    else
  28.    {
  29.        cout << "No es correcto." << endl;
  30.    }
  31.  
  32.    cout << rand(a) << endl;
  33.  
  34.    getch();
  35.    return 0;
  36. }

Como se abran dado cuenta es un juego de piedra papel o tijeras... jeje

Muchas gracias y disculpen las molestias.

Un cordial saludo.


Título: Re: Generar nombre aleatorio.
Publicado por: xaps en 8 Marzo 2014, 14:02 pm
Documentación de rand():
http://www.cplusplus.com/reference/cstdlib/rand/

A veces para saber como funciona algo es tan fácil como buscarlo.

Saludos


Título: Re: Generar nombre aleatorio.
Publicado por: Yugget en 8 Marzo 2014, 14:19 pm
Hola, muy buenas.
Gracias por tu respuesta...

Estoy probando con esto:

   
Código
  1. int t1;
  2.  
  3.    t1 = rand() % 10 + 1;
  4.  
  5.    cout << t1 << endl;

Pero solo se muestra el numero 2...

Saludos.


Título: Re: Generar nombre aleatorio.
Publicado por: xaps en 8 Marzo 2014, 14:24 pm
Tienes que inicializar una semilla para que te genere números aleatorios con srand() (http://www.cplusplus.com/reference/cstdlib/srand/).
Código cogido directamente de la página web que te he pasado:
Código
  1. /* initialize random seed: */
  2. srand (time(NULL));
  3.  
  4. /* generate secret number between 1 and 10: */
  5. iSecret = rand() % 10 + 1;


Título: Re: Generar nombre aleatorio.
Publicado por: ivancea96 en 8 Marzo 2014, 14:25 pm
Rand genera un número pseudoaleatorio. Tienes que establecerle en cada programa, una semilla de la cual, sacará los números.
El comando es:
Código
  1. srand();

Normalmente, la semilla se le pone según la hora.

Código
  1. #include <ctime>
  2.  
  3. int main(){
  4.    srand(time(0));
  5. }


Título: Re: Generar nombre aleatorio.
Publicado por: Yugget en 8 Marzo 2014, 14:43 pm
Muchas gracias, y disculpen mi ignorancia ha sido culpa mía no poner eso... pensé que no hacía falta...

Ahora ya todo va bien pero... ahora quiero que me lo elija entre tres variables:

Código
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.    string num;
  11.    string texto;
  12.    string texto1;
  13.    string texto2;
  14.    int t1;
  15.  
  16.    cout << "Introduce un numero: " << endl;
  17.    cin >> num;
  18.  
  19.    if(num == "tijeras")
  20.    {
  21.        cout << "tijeritas" << endl;
  22.    }
  23.    else if(num == "piedra")
  24.    {
  25.        cout << "piedrita" << endl;
  26.    }
  27.    else if(num == "papel")
  28.    {
  29.        cout << "papelin" << endl;
  30.    }  
  31.    else
  32.    {
  33.        cout << "No es correcto." << endl;
  34.    }
  35.  
  36.    texto = "tijeras";
  37.    texto1 = "piedra";
  38.    texto2 = "papel";
  39.    srand(time(0));
  40.    t1 = rand() % texto + texto1;
  41.  
  42.    getch();
  43.    return 0;
  44. }

Un cordial saludo.


Título: Re: Generar nombre aleatorio.
Publicado por: ivancea96 en 8 Marzo 2014, 15:20 pm
Tienes varias opciones. Te propongo 3:
En primer lugar, generas el número aleatorio entre 0 y 2. Luego...
  • 1: Pones 3 IF-ELSE para cada valor
  • 2: Mejor que la anterior: Haces un SWITCH, con 3 CASE
  • 3: Guardas las string en un array (string arr[3];) y luego haces arr[num_aleatorio];


Título: Re: Generar nombre aleatorio.
Publicado por: amchacon en 8 Marzo 2014, 15:41 pm
Por cierto, el srand solo hay que realizarlo UNA VEZ. Lo digo por si después haces un bucle y haces srand todo el rato...


Título: Re: Generar nombre aleatorio.
Publicado por: Yugget en 8 Marzo 2014, 16:00 pm
Hola, muy buenas.
Gracias a todos por vuestra colaboración, ya está funcionando correctamente ahora solo tengo un problema... y es que se me muestra un número... que será el del case.

ivancea seguí más o menos tus instrucciones....

Código:

Código
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.    string num;
  11.    int t1;
  12.    int resultado;
  13.    srand(time(0));
  14.    resultado = rand() % 3 + 1;
  15.  
  16.    cout << "Introduzca piedra, papel o tijeras: " << endl;
  17.    cin >> num;
  18.  
  19.    switch(resultado)
  20.    {
  21.        case 1:
  22.             cout << "Tijeras" << endl;
  23.             break;
  24.        case 2:
  25.             cout << "Piedra" << endl;
  26.             break;
  27.        case 3:
  28.             cout << "Papel" << endl;
  29.             break;
  30.             default:
  31.             cout << "Ha ocurrido un error..." << endl;
  32.    }
  33.  
  34.    if(num == "tijeras")
  35.    {
  36.        cout << resultado << endl;
  37.    }
  38.    else if(num == "piedra")
  39.    {
  40.        cout << resultado << endl;
  41.    }
  42.    else if(num == "papel")
  43.    {
  44.        cout << resultado << endl;
  45.    }  
  46.    else
  47.    {
  48.        cout << "No es correcto." << endl;
  49.    }
  50.  
  51.    getch();
  52.    return 0;
  53. }

Aquí una imagen del problema:

(http://i.imgur.com/wHK2OMZ.png)

He introducido: tijeras y me da de resultado: piedra < perfecto pero como pueden observar me sale abajo el número 2, si es otro resultado me sale otro número... según haciendo referencia al case opino.

amchacon, gracias lo tendré en cuenta.

Un cordial saludo.


Título: Re: Generar nombre aleatorio.
Publicado por: ivancea96 en 8 Marzo 2014, 16:16 pm
Código:
[quote author=TomasinSG link=topic=410167.msg1925421#msg1925421 date=1394290846]
    if(num == "tijeras")
    {
        cout << resultado << endl;
    }
    else if(num == "piedra")
    {
        cout << resultado << endl;
    }
    else if(num == "papel")
    {
        cout << resultado << endl;
    }
}
[/quote]
Haces cout de "resultado" jiji


Título: Re: Generar nombre aleatorio.
Publicado por: Yugget en 8 Marzo 2014, 16:20 pm
Hola, muy buenas.

¿Entonces cómo puedo imprimirlo?.

Por que he intentado cambiar la variable:

Código
  1. resultado = rand() % 3 + 1;

abajo del switch... pero me lanza al default...

Un cordial saludo.


Título: Re: Generar nombre aleatorio.
Publicado por: ivancea96 en 8 Marzo 2014, 16:31 pm
Qué quieres imprimir? Quién ganó?


Título: Re: Generar nombre aleatorio.
Publicado por: Yugget en 8 Marzo 2014, 16:34 pm
Hola muy buenas,

Osea yo ingreaso: tijeras, papel o piedra... y luego se genera un resultado que es: piedra, papel, o tijeras...

Eso es.. se muestra correctamente pero se muestra el número incognico del case...

Un cordial saludo.


Título: Re: Generar nombre aleatorio.
Publicado por: xaps en 8 Marzo 2014, 17:38 pm
No entiendes lo que hace tu código. Te he añadido un par de líneas de ayuda para que averigües dónde está tu fallo, aunque ya te lo hayan dicho...
Código
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.    string num;
  11.    int t1;
  12.    int resultado;
  13.    srand(time(0));
  14.    resultado = rand() % 3 + 1;
  15.  
  16.    cout << "Introduzca piedra, papel o tijeras: " << endl;
  17.    cin >> num;
  18.  
  19.    //Resultado aleatorio
  20.    switch(resultado)
  21.    {
  22.        case 1:
  23.             cout << "Tijeras" << endl;
  24.             break;
  25.        case 2:
  26.             cout << "Piedra" << endl;
  27.             break;
  28.        case 3:
  29.             cout << "Papel" << endl;
  30.             break;
  31.             default:
  32.             cout << "Ha ocurrido un error..." << endl;
  33.    }
  34.  
  35.    //Resultados no aleatorios (escogido por el usuario)
  36.    if(num == "tijeras")
  37.    {
  38.        cout << resultado << endl;
  39.    }
  40.    else if(num == "piedra")
  41.    {
  42.        cout << resultado << endl;
  43.    }
  44.    else if(num == "papel")
  45.    {
  46.        cout << resultado << endl;
  47.    }  
  48.    else
  49.    {
  50.        cout << "No es correcto." << endl;
  51.    }
  52.  
  53.    getch();
  54.    return 0;
  55. }


Título: Re: Generar nombre aleatorio.
Publicado por: Yugget en 8 Marzo 2014, 17:51 pm
Hola, muy buenas.

Por mi parte no le veo ningún fallo, funciona todo correctamente solo que se muestra el número del case... seguramente por que muestro la variable resultado en un cout como me han dicho:

Código:
Haces cout de "resultado" jiji

Pero entonces cómo podría imprimirlo... estoy probando cambiando de estructura y demás pero sigue igual.

¿Podrían darme alguna otra pista por favor?.

Gracias y disculpe las molestias.

Un cordial saludo.


Título: Re: Generar nombre aleatorio.
Publicado por: xaps en 8 Marzo 2014, 18:13 pm
Imprimir el que? Explícate mejor, no soy el primero en preguntártelo ya...


Título: Re: Generar nombre aleatorio.
Publicado por: ivancea96 en 8 Marzo 2014, 18:24 pm
Dejemos las cosas claras:

Código
  1.    if(num == "tijeras")
  2.    {
  3.        cout << resultado << endl;
  4.    }
  5.    else if(num == "piedra")
  6.    {
  7.        cout << resultado << endl;
  8.    }
  9.    else if(num == "papel")
  10.    {
  11.        cout << resultado << endl;
  12.    }  
  13.    else
  14.    {
  15.        cout << "No es correcto." << endl;
  16.    }
  17.  
  18.    getch();
  19.    return 0;
  20. }

Esa línea escribe el número del case, si "num" es una entrada válida (piedra, papel o tijera). Sinó, muestra el otro mensaje.

Esos if son absurdos. ¿Qué pretendías que hicieran?


Título: Re: Generar nombre aleatorio.
Publicado por: Yugget en 8 Marzo 2014, 18:37 pm
Hola, muy buenas.

He echo esos if, para determinar los caracteres que han introducido en la variable num, osea que si en la variable escribo tijeras y es igual al texto del if se ejecute una sentencia, osea el resultado elejido al azar por el pc.
Y si lo escrito no es ninguno de esos if lo tomará como nulo.

Un cordial saludo.


Título: Re: Generar nombre aleatorio.
Publicado por: ivancea96 en 8 Marzo 2014, 18:53 pm
Esque el resultado, es un numero del 1 al 3.
Quizás prefieras hacer 3 "IF" dentro de cada IF, para poner "Empate", "Derrota", "Victoria".


Título: Re: Generar nombre aleatorio.
Publicado por: Yugget en 8 Marzo 2014, 18:57 pm
Hola muy buenas,

Eso también es verdad, de echo lo voy a probar...

Pero me gustaría antes saber una cosa a poder ser,

¿No hay alguna forma de poder hacer un case con letras?.

Osea en vez de ser así:

case 1

sea

case HOLA

Un cordial saludo.


Título: Re: Generar nombre aleatorio.
Publicado por: Yugget en 8 Marzo 2014, 19:34 pm
Hola, muy buenas.

Muchas gracias, por vuestra ayuda.
Ya está todo solucionado, he echo lo de los if y ya todo me funciona correctamente.

Muchas gracias por vuestra ayuda.

Un cordial saludo.


Título: Re: [SOLUCIONADO] Generar nombre aleatorio.
Publicado por: Yoel Alejandro en 10 Marzo 2014, 01:11 am
Hola a todos. Creo que al programilla le falta la parte donde decide quién ganó (o quizá yo no la vi, sorry). Como un switch() anidado con las nueve posibilidades sería muy tedioso es más cómodo definir una matriz de 3x3, donde la opción 1 representa tijera, 2 la piedra, 3 el papel. En la posición (i,j) de la matriz se pone:
  • 1, si i le gana a j
  • -1, si i pierde ante j
  • 0, si son iguales y hay empate

Así por ejemplo, para el caso de la tijera, como empata consigo misma, pierde ante piedra y gana ante papel, la primera fila de la matriz debe ser {0, -1, 1}. El programa inspecciona el elemento de la matriz, y ahí sabe si usted ganó, perdió o empató.

En la primera parte del programa el usuario elige tijera, piedra o papel pulsando '1', '2' ó '3' (más cómodo que escribir el nombre completo), y este valor entero se deposita en la variable human_op. Luego, elige la máquina al azar usando rand() y srand(), y su valor se deposita en machine_op. Como ya se explicó, el valor de A[human_op - 1][machine_op - 1] dará la respuesta.

Al final, te pregunta si quieres jugar de nuevo y así sucesivamente. Confieso que yo mismo me puse a jugar contra la máquina y casi me envicio, jajaja  >:D.

Un detalle, la función clear_screen() está codificada para Windows y para Linux. En Windows debes dejar la línea system("cls") y comentariar  system("clear"), mientras en Linux se hace al revés. La versión que pongo aquí está para Windows:

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <time.h>
  4.  
  5. void clear_screen( void );
  6.  
  7. using namespace std;
  8.  
  9. int main () {
  10.  
  11.    string human, machine;
  12.    int human_op = 0;        /* 1: tijera, 2: piedra, 3: papel */
  13.    int machine_op = 0;
  14.    char next;                /* next == 's' indica que se quiere seguir jugando */
  15.  
  16.    /* Declarar matriz de casos:
  17.      *
  18.      * 1: tijera, 2: piedra, 3: papel
  19.      *
  20.      * El elemento (i,j) vale:
  21.      *   1 si "i le gana a j"
  22.      *  -1 si "i pierde ante j"
  23.      *   0 si hay empate
  24.      */
  25.    int A[3][3] = {{0, -1, 1}, {1, 0, -1}, {-1, 1, 0}};
  26.  
  27.    /* inicializar semilla */
  28.    srand( time(NULL) );
  29.  
  30.    do {
  31.  
  32.        /* El humano elige */
  33.        do {
  34.            clear_screen( );        /* borrar pantalla */
  35.            cout << "Juego piedra, papel o tijera ..." << endl << endl
  36.                << "1: tijera" << endl
  37.                << "2: piedra" << endl
  38.                << "3: papel" << endl << endl
  39.                << "elige: ";
  40.            cin >> human_op;
  41.        } while ( human_op < 1 || human_op > 3 );
  42.        switch ( human_op ) {
  43.            case 1:
  44.                human = "tijera";
  45.                break;
  46.            case 2:
  47.                human = "piedra";
  48.                break;
  49.            case 3:
  50.                human = "papel";
  51.                break;
  52.        }
  53.  
  54.        /* La maquina elige */
  55.        machine_op = rand( ) % 3 + 1;
  56.        switch ( machine_op ) {
  57.            case 1:
  58.                machine = "tijera";
  59.                break;
  60.            case 2:
  61.                machine = "piedra";
  62.                break;
  63.            case 3:
  64.                machine = "papel";
  65.                break;
  66.        }
  67.  
  68.        /* Ahora se decide quien gana */
  69.        cout << endl << "Usted elige: " << human << endl
  70.            << "La maquina elige: " << machine << endl << endl
  71.            << "... ";
  72.        switch ( A[human_op - 1][machine_op - 1] ) {
  73.            case 1:
  74.                cout << "Usted gana !!!" << endl;
  75.                break;
  76.            case -1:
  77.                cout << "Ups, usted pierde" << endl;
  78.                break;
  79.            case 0:
  80.                cout << "Empate" << endl;
  81.                break;
  82.        }
  83.  
  84.        /* Seguir jugando ? */
  85.        cout << "Seguir jugando s/n? ";
  86.        cin >> next;
  87.    } while ( next == 's' );
  88. }
  89.  
  90. /* Borra la pantalla */
  91. void clear_screen( void ) {
  92.  
  93.    /* para Windows */
  94.    system( "cls" );
  95.    /* para Linux */
  96.    //system( "clear" );
  97. }


Título: Re: [SOLUCIONADO] Generar nombre aleatorio.
Publicado por: leosansan en 10 Marzo 2014, 04:46 am

* Te faltó el return de main.

*  Es  más propio de C++ usar <ctime> en lugar de  <time.h> ...pijo que es uno.

* Hecho de menos unos contadores de las partidas ganadas, empatadas y perdidas.

Por lo demás, lo has bordado con la matriz.


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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: [SOLUCIONADO] Generar nombre aleatorio.
Publicado por: BlackM4ster en 10 Marzo 2014, 09:17 am
Cuando he leído el título, pensaba que hablabas sobre algo así:
http://zonaisc.com/web/?q=node/16


Título: Re: [SOLUCIONADO] Generar nombre aleatorio.
Publicado por: Yoel Alejandro en 11 Marzo 2014, 02:13 am
Leo, ¿En serio se me olvidó el return de main()? Jaja, pero que burdo, sorry  :-[ !!!

Pero de veras que el programa está divertido, provoca fajarse a jugar contra la máquina, jaja.
Bueno, con las modificaciones que propones (contador de ganadas, perdidas y empatadas), quedaría:

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <ctime>
  4.  
  5. void clear_screen( void );
  6.  
  7. using namespace std;
  8.  
  9. int main () {
  10.  
  11.   string human, machine;
  12.   int human_op = 0;      /* 1: tijera, 2: piedra, 3: papel */
  13.   int machine_op = 0;
  14.   char next;            /* next == 's' indica que se quiere seguir jugando */
  15.   int ganadas, perdidas, empates;
  16.  
  17.   /* Declarar matriz de casos:
  18.     *
  19.     * 1: tijera, 2: piedra, 3: papel
  20.     *
  21.     * El elemento (i,j) vale:
  22.     *   1 si "i le gana a j"
  23.     *  -1 si "i pierde ante j"
  24.     *   0 si hay empate
  25.     */
  26.   int A[3][3] = {{0, -1, 1}, {1, 0, -1}, {-1, 1, 0}};
  27.  
  28.   /* inicializar semilla */
  29.   srand( time(NULL) );
  30.   ganadas = perdidas = empates = 0;
  31.  
  32.   do {
  33.  
  34.      /* El humano elige */
  35.      do {
  36.         clear_screen( );      /* borrar pantalla */
  37.         cout << "Juego piedra, papel o tijera ..." << endl << endl
  38.            << "1: tijera" << endl
  39.            << "2: piedra" << endl
  40.            << "3: papel" << endl << endl
  41.            << "elige: ";
  42.         cin >> human_op;
  43.      } while ( human_op < 1 || human_op > 3 );
  44.      switch ( human_op ) {
  45.         case 1:
  46.            human = "tijera";
  47.            break;
  48.         case 2:
  49.            human = "piedra";
  50.            break;
  51.         case 3:
  52.            human = "papel";
  53.            break;
  54.      }
  55.  
  56.      /* La máquina elige */
  57.      machine_op = rand( ) % 3 + 1;
  58.      switch ( machine_op ) {
  59.         case 1:
  60.            machine = "tijera";
  61.            break;
  62.         case 2:
  63.            machine = "piedra";
  64.            break;
  65.         case 3:
  66.            machine = "papel";
  67.            break;
  68.      }
  69.  
  70.      /* Ahora se decide quien gana */
  71.      cout << endl << "Usted elige: " << human << endl
  72.         << "La maquina elige: " << machine << endl << endl
  73.         << "... ";
  74.      switch ( A[human_op - 1][machine_op - 1] ) {
  75.         case 1:
  76.            cout << "Usted gana !!!" << endl;
  77.            ganadas++;
  78.            break;
  79.         case -1:
  80.            cout << "Ups, usted pierde" << endl;
  81.            perdidas++;
  82.            break;
  83.         case 0:
  84.            cout << "Empate" << endl;
  85.            empates++;
  86.            break;
  87.      }
  88.  
  89.      /* Seguir jugando ? */
  90.      cout << ganadas << " ganadas, " << perdidas << " perdidas, "
  91.         << empates << " empates" << endl << endl;
  92.      cout << "Seguir jugando s/n? ";
  93.      cin >> next;
  94.   } while ( next == 's' );
  95.  
  96.   return 0;
  97. }
  98.  
  99. /* Borra la pantalla */
  100. void clear_screen( void ) {
  101.  
  102.   /* para Windows */
  103.   //system( "cls" );
  104.   /* para Linux */
  105.   system( "clear" );
  106. }