Ayuda con la función rand.

Iniciado por Felipe_Henriquez, 31 Octubre 2011, 18:59 PM

0 Miembros y 1 Visitante están viendo este tema.

Felipe_Henriquez

Muy buenas, hace tiempo ya no creaba un nuevo tema....
He estado estudiando C y he llegado a funciones, pero la función rand de <stdlib.h> no logro comprenderla, cito el enunciado del libro de C que estudio....

La función rand genera un entero sin signo entre 0 y RAND_MAX suponiendo que RAND_MAX es 32767, hasta ahi todo bien se que rand(), genera un numero entre 0 y 32767 al azar...
Cito nuevamente: El rango de valores que produce rand de manera directa, a menudo difiere del requerido por la aplicación. Por ejemplo, un programa que simula el lanzamiento de una moneda sólo requiere 0 para "cara" y 1 para "cruz". Un programa que simula el tiro de un dado de seis lados requiere enteros al azar entre 1 y 6. Para demostrar la función rand, desarrollemos un programa que simule 20 tiros de un dado de seis lados y que despliegue el valor de cada tiro. El prototipo de función para la función rand se puede encontrar en <stdlib.h> para producir números en rango de 1 a 5, utilizamos el operador módulo (%) junto con rand de la siguiente manera: rand() % 6.
Hasta ahí quedo totalmente desorientado, no se supone que genera valores al azar entre 0 y rand max? para que sirve el módulo?....
Un ejemplo inocente de como trato de entenderlo si genera un valor de 0 entre RAND_MAX: supongamos generó 1000 y le saca el resto 6 generaria un 4 no?, la verdad no entiendo....
Desde ya gracias, si tuviera profesor de programación no preguntaría, les agradezco por haber leido y más a los que contestan un abrazo!.

Queta

Es lógico ya que, por ejemplo, dado el numero 10, si dividimos cualquier número real por éste, su resto/módulo siempre será 0, 1, 2, 3, 4, 5, 6, 7, 8 o 9; por consiguiente:

(rand() % 10) + 1

El resultado de esta operación siempre será un número entre 1 y 10. El ejemplo mismo aplicado al dado, podría ser:

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

int main(void)
{
int numero_dado = (rand() % 6) + 1;

printf("%d", numero_dado);

getchar();

return 0;
}
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

Felipe_Henriquez

Gracias Queta por tu respuesta....

int numero_dado = (rand() % 6) + 1;

Haber si lo entiendo:
rand va a generar un numero aleatorio cualquiera cierto? supongamos saca el 2000 y le aplica el modulo de 6 o resto.... 6 * 333 = 1998 y su resto 2. Y ¿para que le sumamos el 1? eso daria 3.... no? el sumarle 1 que nos asegura? que si da resto 0 tengamos el numero de dado 1 no? y como resto 6 no puede dar bajo ningún motivo, llegamos a él  sumando 1 a resto 5.... si es así creo que comprendí a la perfección muchas gracias de verdad por tu ayuda y espero su respuesta para corregir o para corroborar mi información muchas gracias abrazo!.

Queta

Exactamente, es para evitar que salga el 0. Siguiendo la lógica de rand + módulo se podría haber pensado el siguiente ejemplo para sacar el número de un dado:

int numero_dado = rand() % 7;

Pero lo que pasaría es que obtendrías un número entre 0 y 6, luego si se sumara 1 quedaría entre 1 y 7, y el 7 no existe en un dado de 6 caras.
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

Felipe_Henriquez

Uh de verdad que te pasaste  ;D Queta, no estudio formal ni nada soy un programador empirico, haber si el próximo año ya puedo formalizar estudios un gran abrazo!

Queta

"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.