| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
lidikat
Registrado: 01 Ene 2013 Mensajes: 23
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |