0
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
    {
        char *v[3] = {"piedra", "Papel", "tijeras"};
        int ju, pc, jugados = 1, ganados = 0, perdidos = 0;

            randomize();
            do
            {
                    printf("Jugada %d, elija una opcion (1, 2, 3) G: %d P: %d\n", jugados, ganados, perdidos);
                    printf ("1. Piedra\n");
                    printf ("2. Papel\n");
                    printf("3. tijeras\n");
                    do 
                    scanf ("%d", &ju);
                    while ((ju == '\n') && (ju != '1'|| ju != '2' || ju != '3'));
                    while (getchar() != '\n');
                    ju --;
                    pc = rand () % 3;
                    printf("Ud. eligio %s, la PC eligio %s => ", v[ju], v[pc]);
                    if (ju == pc)
                    printf ("Hay empate\n");
                    else if ((ju == 0 && pc == 2) || (ju == 1 && pc == 0)|| (ju == 2 && pc == 1))
                    {
                        printf ("Ud. gana\n");
                        ganados++;
                    }
                    else 
                    {
                        printf("La PC gana\n");
                        perdidos++;
                    }
                    jugados++;
                    printf("----------------------\n");
            }
            while (ganados < 5 && perdidos < 5);
            if (ganados > perdidos)
            printf ("Ud ha ganado en %d intentos.", jugados);
            else 
            printf("Ud ha perdido en %d intentos.", jugados);
            getchar();
            return 0;
    }
Víctor
  • 826
  • 8
  • 15
Redes del Hack
  • 9
  • 1
  • 2
  • 3

2 Answers2

1

Lo que te está sucendiendo es que el programa está inicializando todo el rato el generador de números aleatorios con la misma semilla, lo que hace que la secuencia de números aleatorios sea la misma ejecución tras ejecución.

Si no te puedes permitir el lujo de compilar con C++11 (estándar del 2011), y solo para pruebas, puesto que no es una opción muy segura a nivel de programa final, puedes inicializar la semilla así:

srand(time(NULL));

Con esto inicializas la semilla con la hora actual de tu sistema... por lo que cada ejecución te arrojará resultados diferentes. Esta solución no es muy segura por la poca precisión que ofrece, lo que facilita que alguien pueda predecir los valores aleatorios obtenidos.

Si la compilación con C++11 está permitida sería más recomendable usar la librería <random>

// Inicialización
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<int> rand(0, 3);

// números aleatorios
for( int i=0; i<10; i++ )
{
  int pc = rand(mt);
  std::cout << pc << ' ';
}
eferion
  • 49,291
  • 5
  • 30
  • 72
0

Lo primero ante todo, este código es más código C que código C++. Pero después de resolver tu problema con randomize() es capaz de compilar para cualquiera de los dos. randomize() es una función de estilo Borland, aunque puede todavía estar disponible en algunos compiladores, no es parte del estándar. La forma de dar una nueva semilla al generador de números aleatorios de modo que cada vez que se ejecute el programa los resultados sean diferentes, es mediante srand() al cual incluyendo el archivo de cabecera time.h permite llamar a la función time(NULL) sustituyendo finalmente el no estándar randomize(); por srand(time(NULL));

Tu código queda así:

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

int main(int argc, char* argv[])
    {
        char *v[3] = {"piedra", "Papel", "tijeras"};
        int ju, pc, jugados = 1, ganados = 0, perdidos = 0;

             srand(time(NULL)); 
            do
            {
                    printf("Jugada %d, elija una opcion (1, 2, 3) G: %d P: %d\n", jugados, ganados, perdidos);
                    printf ("1. Piedra\n");
                    printf ("2. Papel\n");
                    printf("3. tijeras\n");
                    do 
                    scanf ("%d", &ju);
                    while ((ju == '\n') && (ju != '1'|| ju != '2' || ju != '3'));
                    while (getchar() != '\n');
                    ju --;
                    pc = rand () % 3;
                    printf("Ud. eligio %s, la PC eligio %s => ", v[ju], v[pc]);
                    if (ju == pc)
                    printf ("Hay empate\n");
                    else if ((ju == 0 && pc == 2) || (ju == 1 && pc == 0)|| (ju == 2 && pc == 1))
                    {
                        printf ("Ud. gana\n");
                        ganados++;
                    }
                    else 
                    {
                        printf("La PC gana\n");
                        perdidos++;
                    }
                    jugados++;
                    printf("----------------------\n");
            }
            while (ganados < 5 && perdidos < 5);
            if (ganados > perdidos)
            printf ("Ud ha ganado en %d intentos.", jugados);
            else 
            printf("Ud ha perdido en %d intentos.", jugados);
            getchar();
            return 0;
    }
Víctor
  • 826
  • 8
  • 15
  • 2
    "*Lo primero ante todo, este código es más código C que código C++*", a mi lo que me parece es que es completamente C con **nada** de C++ :P – PaperBirdMaster Nov 16 '17 at 08:41
  • Compila tanto en C como en C++, pero no emplea ninguna característica de C++. Por eso lo decía :) – Víctor Nov 16 '17 at 10:31
  • Ni características ni cabeceras, `` y `` son cabeceras de C, si quisiera programar en C++ tendría que usar las mismas [cabeceras adaptadas a C++](https://es.stackoverflow.com/a/48305/2742): `` y `` – PaperBirdMaster Nov 16 '17 at 10:41
  • Piensa que también se puede inyectar código ensamblador en C++... por esa regla de tres podríamos asumir que un programa escrito en ensamblador también podría estar escrito en C++ – eferion Nov 16 '17 at 12:33
  • Muchas gracias @PaperBirdMaster y eferion por vuestros comentarios. Se aprende mucho de vosotros :) – Víctor Nov 16 '17 at 13:47