Documentos de Académico
Documentos de Profesional
Documentos de Cultura
4. Números Aleatorios
Una característica importante en la gran mayoría de lenguajes de programación es la posibilidad de ge-
nerar números aleatorios.
Los números aleatorios son pieza clave en la programación de juegos de azar, simulaciones, cifrado de
datos, en modelos estadísticos, etc. En esta capítulo aprenderemos a generar números aleatorios para
automatizar el proceso de llenado de arreglos y más.
xn = axn−1 mód m
donde a y m son enteros positivos dados y lo anterior significa que axn−1 se divide entre m y el residuo
se considera como el valor de xn .
xn
Así, cada xn toma valores entre: 0, 1, . . . m − 1 y la expresión
(llamada número pseudoaleatorio) se
m
considera como una aproximación del valor de una variable aleatoria uniforme en el intervalo (0, 1).
La generación de números aleatorios en C++ se realiza por medio de la función rand(), misma que se
encuentra definida en la librería cstdlib. La función rand() devuelve un número entero aleatorio en el
rango de 0 a RAND_MAX, donde RAND_MAX es el límite superior y este último depende de la capacidad
computacional del ordenador, así como del sistema operativo.
Ejemplo 1. El siguiente programa genera y almacena 20 números enteros aleatorios entre 0 y RAND_MAX.
1 Semestre 2021-A
Programación – E.P.N
Si ejecutamos varias veces el programa anterior se puede observar que los números obtenidos en cada
ejecución coinciden. Esto se debe principalmente a que la semilla es exactamente la misma en cada
ejecución. Para solventar este problema se recomienda resetear la semilla en cada llamado del código
por medio del siguiente comando:
srand(time(NULL));
donde srand accede al valor de la semilla y time reemplaza el valor de la semilla por la fecha y hora de
ejecución.
Siempre que se desee replicar un experimento o análisis lo recomendado es fijar una semilla. Por ejemplo:
srand(12345)
Ejemplo 2. El siguiente programa genera 5 números aleatorios enteros distintos en cada ejecución.
En ocasiones, se hace necesario generar números aleatorios enteros comprendidos en el rango [0, M ],
con M ∈ N. Para ello, definiremos un nuevo límite superior empleado la notación del módulo ( %):
2 Semestre 2021-A
Programación – E.P.N
Ejemplo 3. El siguiente programa que genera 100 números aleatorios entre [0, 20] y obtiene la suma de
dichos números.
por tanto,
b · yn ∼ U [0, b], para b ∈ R+
y además,
a + b · yn ∼ U [a, a + b], para a ∈ R y b ∈ R+
Ejemplo 4. El siguiente programa genera 10 números aleatorios con 4 decimales en el intervalo [1, 4].
3 Semestre 2021-A
Programación – E.P.N
7
8 // Semilla aleatoria
9 srand(time(NULL ));
10
11 // Generamos valores entre 0 y RAND_MAX
12 for(int i=0; i <10; i++){
13 vec[i] = 1 + ( double ) (rand () % 30001)/10000;
14 cout << vec[i] << " ";
15 };
16
17 return 0;
18 }
Para calcular el valor de θ note que si U está distribuida uniformemente en (0, 1), entonces podemos
expresar θ como:
θ = E[g(U )]
Si U1 , U2 , . . . , Uk son variables aleatorias independientes y uniformes en (0, 1), esto implica que g(U1 ), g(U2 ),
. . . , g(Uk ) son variables aleatorias independientes e idénticamente distribuidas con media θ.
Por lo tanto, por la ley fuerte de los grandes números, se tiene, con probabilidad igual a 1 que:
∑
k
g(Ui )
→ E[g(U )] = θ, cuando k → ∞
i=1
k
1. Generar una cantidad suficientemente grande de números aleatorios distribuidos en el rango (0, 1).
2. Evaluar la función que se intenta integrar en cada uno de los números aleatorios anteriores.
3. Obtener el promedio de los resultados obtenidos en el paso 2.
4 Semestre 2021-A
Programación – E.P.N
5 Semestre 2021-A
Programación – E.P.N
donde h(y) = (b − a)g (a + [b − a]y). Así, podemos aproximar θ al generar de manera continua números
aleatorios y luego considerar el valor promedio de h evaluada en estos números aleatorios.
Ejemplo 7. El siguiente programa calcula la integral definida:
∫ 5
x
θ= dx
2 x2 − 1
6 Semestre 2021-A
Programación – E.P.N
1 −dx
y= , dy = = −y 2 dx
x+1 (x + 1)2
donde ( )
g 1
y −1
h(y) =
y2
7 Semestre 2021-A