Está en la página 1de 4

Generación de números aleatorios

La función rand genera un entero sin signo entre 0 y RAND_MAX (una constante
simbólica definida en el encabezado <stdlib.h>). El estándar de ANSI, establece que el valor
de RAND_MAX debe ser al menos de 32767, el cual es el valor máximo para un entero de
dos bytes (es decir, 16 bits). Los programas de esta sección se probaron en un sistema C con
un valor máximo de 32767 para RAND_MAX. Si rand realmente genera enteros al azar, cada
número entre 0 y RAND_MAX tiene la misma oportunidad (o probabilidad) de ser elegido
cada vez que se invoca a rand.
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 el rango de 1 a 5, utilizamos el operador módulo (%) junto con rand
de la siguiente manera:
rand() % 6
A esto se le llama escalamiento. Al número 6 se le denomina factor de escalamiento.
Después cambiamos el rango de los números que se producen, sumando 1 a nuestro
resultado previo. La salida del siguiente código confirma que los resultados se encuentran
en el rango de 1 a 6.

La operación módulo % obtiene el resto de la división de un número entre otro.

Germán Robles
1
En pantalla se mostrará:

6 6 5 5 6
5 1 1 5 3
6 6 2 4 2
6 2 3 4 1

Para mostrar que los números producidos por la función rand ocurren aproximadamente
con la misma probabilidad, simulemos 6000 tiros de dados con el siguiente programa. Cada
entero en el rango de 1 a 6 debe aparecer aproximadamente 1,000 veces.

Muestra en pantalla:

Germán Robles
2
La función rand genera números pseudoaleatorios. Al llamar repetidamente a rand, se
produce una secuencia de números que parece ser aleatorios. Sin embargo, la secuencia se
repite a sí misma cada vez que se ejecuta el programa. Una vez que depuramos el programa
por completo, lo podemos condicionar para producir secuencias diferentes de números
aleatorios para cada ejecución. A esto se le denomina randomizar, y se lleva a cabo
mediante la función srand de la biblioteca. La función srand toma un entero unsigned como
argumento y establece la semilla de la función rand para producir una secuencia diferente
de números aleatorios para cada ejecución del programa.
En el siguiente código mostramos el uso de srand. En el programa, utilizamos el tipo de
dato unsigned, el cual es una abreviatura de unsigned int. Un entero se almacena en al
menos dos bytes de memoria, y puede contener tanto valores positivos como negativos.
Una variable de tipo unsigned también se almacena en al menos dos bytes de memoria. Un
entero de dos bytes unsigned int sólo puede contener valores positivos en el rango de 0 a
65535. Un entero unsigned int de cuatro bytes sólo puede contener valores positivos en el
rango de 0 a 4294967295. La función srand toma un valor unsigned como argumento. El
especificador de conversión %u se utiliza para leer un valor unsigned por medio de scanf.
El prototipo de la función de srand se encuentra en <stdlib.h>.

Se muestra en pantalla:

Germán Robles
3
Ejecutemos el programa varias veces y observemos los resultados. Observe que cada vez
que ejecutamos el programa obtenemos una secuencia de números diferente, debido a que
proporcionamos una semilla diferente. Si queremos randomizar sin tener que introducir
una semilla diferente cada vez, podemos utilizar la siguiente instrucción:
srand( time( NULL ) );
Esto provoca que la computadora lea su reloj y obtenga el valor para la semilla de manera
automática. La función time devuelve la hora del día en segundos. Este valor se convierte
en un entero sin signo y se utiliza como semilla para la generación de números aleatorios.
La función time toma un argumento NULL (time es capaz de proporcionar al programador
la cadena que representa la hora del día; NULL deshabilita esta capacidad para la llamada
específica a la función). El prototipo de la función para time se encuentra en <time.h>.

Bibliografía
Deitel, H. M. & Deitel, P. J., Cómo programar en C/C++ y Java, 4ta. Ed., Pearson Education,
México, 2004.

Consultas o correcciones enviar a germanrobles@tec17ba.edu.ar. Muchas gracias.

Germán Robles
4

También podría gustarte