/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Números aleatorios (subprogramas c++)

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
lidikat



Registrado: 01 Ene 2013
Mensajes: 23

MensajePublicado: 19/03/2013 9:54 am
Título: Números aleatorios (subprogramas c++)

Hola, en un ejercicio que tengo que hacer, el cual consiste en el juego del amarillo-verde-rojo y me viene un código el cual tengo que usar y es el siguiente

Código:
// Inicializa los números aleatorios, llamarla una única vez, antes de cualquier
invocación de aleatorio
void iniciarAleatorios()
{
srand(time(0));
}
// Genera un número aleatorio entre a y b (ambos incluidos)
int siguienteAleatorio (int a, int b)
{
return (rand()%(b-a+1)) + a;
}


Tengo que hacer que el ordenador genere tres números aleatorios (sin mostrar por pantalla) y yo tengo que adivinar el número según unas pistas. Lo que no tengo claro es como funciona este subprograma que me dan, yo quiero generar tres números entre 0 y 9 pero no sé si tengo que llamarlo tres veces ni como he de usar los dos.

un saludo!
Volver arriba
Masakre



Registrado: 06 Jun 2012
Mensajes: 245

MensajePublicado: 19/03/2013 11:13 am
Título:

Esta primera función es necesaria para inicializar srand().
Es decir, le especificas la semilla que originará los aleatorios.
Código:
void iniciarAleatorios()
{
srand(time(0));
}


Si en vez de time(0) escribieras algún número constante, por ejemplo, los resultados al usar rand() serían siempre los mismos. Pero así como está, como el tiempo cambia (me parece que específicamente se refiere a la hora de tu ordenador o el tiempo que lleva prendido), los resultados también cambiarán.

Si deseas obtener un número aleatorio entre 0 y 9:
Código:
int valor_aleatorio = siguienteAleatorio (0, 9);


O si prefieres hacerlo directamente, sin llamar a la función:
Código:
int valor_aleatorio = rand()%10;


El valor de rand() se genera en base a la semilla con que fue inicializado, pero dicho valor generado varía entre 0 y RAND_MAX (normalmente 32767).
Es por eso que se usa el operador % (módulo) para delimitir ese valor y obtener uno entre el rango deseado.
Por ejemplo, con rand()%10, el valor generado será obligatoriamente menor que 9.
¿Por qué? Al dividir entre 10, jamás podría "sobrar" 10, a lo más 9.
Volver arriba
lidikat



Registrado: 01 Ene 2013
Mensajes: 23

MensajePublicado: 29/03/2013 8:02 am
Título:

Hola,
muchas gracias por la explicación.
Esos códigos los he estado usando para un ejercicio cuyo enunciado es el siguiente:


-----------------------------------------------------------------------------------
Escriba un programa que juegue al juego del Rojo-amarillo-verde. El programa genera tres dígitos aleatorios
distintos entre 0 y 9. A estos dígitos se les asignan las posiciones 1, 2 y 3. El objetivo del juego es adivinar los dígitos
así como sus posiciones correctas en el menor número de intentos posibles. Para cada intento, el jugador proporciona
tres dígitos para las posiciones 1, 2 y 3. El programa responde con una pista que consta de rojo, amarillo y verde. Si un
dígito está en la posición correcta, la respuesta es verde. Si el dígito adivinado está en una posición incorrecta, la
respuesta es amarillo. Si el dígito para una posición dada no coincide con ninguno de los tres dígitos, la respuesta es
rojo. A continuación se muestra un ejemplo de respuestas para los dígitos 6, 5 y 8 en las posiciones 1, 2 y 3
respectivamente:
Intento
Pista
1 2 5
rojo
rojo
amarillo
8 5 3
amarillo
verde
rojo
8 5 6
amarillo
verde
amarillo
6 5 8
verde
verde
verde

-------------------------------------------------------------------------------

Creo que más o menos lo tengo pero no me termina de funcionar bien, os dejo el programa tal y como lo tengo por ahora

Código:
#include <iostream>
using namespace std;
void iniciarAleatorios();
int siguienteAleatorio (int a, int b);

int main()
{
    unsigned a=0;
    unsigned b=9;
    int c,d,e;
   
    iniciarAleatorios();
    c=siguienteAleatorio(0,9);
    d=siguienteAleatorio(0,9);
    e=siguienteAleatorio(0,9);
   
    int num1, num2, num3;
    do
    {
          cout << "Introduce tres numeros: ";
          cin >> num1 >> num2 >> num3;
         
     
          if(c==num1)
          {
                    cout << "Verde  ";
                    }
                    else if ((c==num2)||(c==num3))
                    {
                         cout << "Amarillo  ";
                         }
                         else
                         {
                              cout << "Rojo  ";
                              }
                             
     
          if(d==num2)
          {
                    cout << "Verde  ";
                    }
                    else if ((d==num1)||(d==num3))
                    {
                         cout << "Amarillo  ";
                         }
                         else
                         {
                              cout << "Rojo  ";
                              }
         
          if(e==num3)
          {
                    cout << "Verde  ";
                    }
                    else if ((e==num2)||(e==num1))
                    {
                         cout << "Amarillo  ";
                         }
                         else
                         {
                              cout << "Rojo  ";
                              }
         
          }while ((c = num1)&&(d = num2)&&(e = num3));
   
    system("pause");
    return 0;
}
   

void iniciarAleatorios()
{
srand(time(0));
}
// Genera un número aleatorio entre a y b (ambos incluidos)
int siguienteAleatorio (int a, int b)
{
return (rand()%(b-a+1)) + a;
}
Volver arriba
Masakre



Registrado: 06 Jun 2012
Mensajes: 245

MensajePublicado: 29/03/2013 8:45 am
Título:

La condición del while while que has escrito:
Código:
(c = num1)&&(d = num2)&&(e = num3)

- Por una lado realiza asginaciones, es decir, los valores num1,num2,num3 que ingresa el usuario se almacenan en c,d,e reemplazando los valores que obtuviste anteriormente de manera aleatoria. Recuerda que para evaluar si 2 valores son iguales, debes usar == (doble vez el caracter '=').
- Y por otro, el while acabaría sólo si el usuario ingresa un 0 (o más ceros).
Si el usuario ingresa un 0 en cualquiera de las 3 variables, ese rvalue (el valor que se asigna, en este caso, cero) pasa a ser el valor de la asignación (es decir, además de asignarse a la varible de la izquierda, es el valor que se considera al momento de evaluar los operadores and) y por lo tanto, toda la condición sería false.

Entonces cambié la condición del while, de modo que diga:
"Hacer mientras c sea diferente de num1, o d sea diferente de num2 o e sea diferente de num3"
Es decir, basta que uno no coincida para que sigan las iteraciones del bucle.

Además le puse un contador que advierta en cuántos intentos conseguiste ganar.
Testeando el programa conseguí hacerlo en sólo 3 intentos jeje.

Así es como finaliza (este resultado es de otra partida):
Cita:
Felicidades! Lo conseguiste en 5 intentos.
Process returned 0 (0x0) execution time : 23.187 s
Press any key to continue.

(Code::Blocks incluso indica el tiempo que estuvo el programa en funcionamiento y sirve para ver qué tan buenos somos en el juego del Rojo-Amarillo-Verde).

PD: No estabas haciendo uso de los unsigned a y b, es por eso que los paso como parámetros a siguienteAleatorio(). Si quieres cambiar el rango de valores, sólo bastaría cambiar los valores de a y b (que también podrías declararlos como const, o sino, pedirle al usuario que diga el rango, para que así él pueda elegir la dificultad del juego).
Volver arriba
Masakre



Registrado: 06 Jun 2012
Mensajes: 245

MensajePublicado: 29/03/2013 12:20 pm
Título:

Disculpa, había olvidado escribir el código con las correcciones:
Código:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

void iniciarAleatorios();
int siguienteAleatorio (int a, int b);

int main()
{
    unsigned a = 0, b = 9, veces = 0;
    int c,d,e;

    iniciarAleatorios();
    c=siguienteAleatorio(a,b);
    d=siguienteAleatorio(a,b);
    e=siguienteAleatorio(a,b);

    int num1, num2, num3;
    do
    {
        cout << "Introduce tres numeros [0-9]: ";
        cin >> num1 >> num2 >> num3;

        if(num1==c)
            cout << "Verde  ";
        else if (num1==d || num1==e)
            cout << "Amarillo  ";
        else cout << "Rojo  ";

        if(num2==d)
        cout << "Verde  ";
        else if (num2==c || num2==e)
            cout << "Amarillo  ";
        else cout << "Rojo  ";

        if(num3==e)
            cout << "Verde";
        else if (num3==c || num3==d)
            cout << "Amarillo";
        else cout << "Rojo";

        cout<<endl<<endl;
        system("pause"); system("cls");
        ++veces;

    }while ( c != num1 || d != num2 || e != num3 );

    cout<<"Felicidades! Lo conseguiste en "<<veces<<" intentos.";
    return 0;
}

void iniciarAleatorios()
{
    srand(time(0));
}

// Genera un número aleatorio entre a y b (ambos incluidos)
int siguienteAleatorio (int a, int b)
{
    return (rand()%(b-a+1)) + a;
}


PD: Fíjate que también he cambiado las condiciones de los if y else.
Anteriormente, si num1 (valor ingresado en posición 1) no era igual a c (primer valor generado), se veía si c era igual a num2 o num3 (valores ingresados por el usuario). Pero no era así.
Lo correcto es que, si no es verde, se compare num1 con d y e.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com