Sección : Simulación, modelos y realidad
Previo : Modelos
Siguiente : Sucesiones uniformes


Generadores pseudo-aleatorios


Todos los lenguajes de programación (o casi todos) tienen un generador pseudo-aleatorio. Las sintaxis varían: ran, grand, rand, Random...  Estas son funciones que, según los manuales de usuarios, ``dan como resultado números al azar''. Lo que se entiende por ``números al azar'' depende, en principio, del tipo de número (booleanos, enteros, reales). Convenimos en denotar por Random a la función que ``da como resultado un número real al azar en el intervalo $ [0,1]$''. Esta frase contiene, de hecho, a dos propiedades distintas, que admitiremos como postulados.

Postulados.

  1. Para todo $ (a,b)$, $ 0\leq a<b\leq 1$, $ \mathbb {P}[~$ Random$ \in ]a,b]~]=b-a$.
  2. Las llamadas consecutivas de Random son experimentos aleatorios independientes.

Interpretación:

En el lenguaje corriente ``al azar'' no significa solamente aleatorio si no también uniformemente distribuido. Seleccionar al azar, es dar las mismas oportunidades a todos los resultados posibles (equiprobabilidad). Lo que se espera de un número real seleccionado ``al azar'' en $ [0,1]$ es que caiga entre $ 0.4$ y $ 0.5$ con probabilidad $ 1/10$, y esta probabilidad es la misma de caer entre $ 0.8$ y $ 0.9$. Dos intervalos incluidos en $ [0,1]$ tienen la misma probabilidad de que el número se encuentre en ellos, si tienen la misma longitud, y esta probabilidad es la longitud de los intervalos. Los postulados anteriores tienen otra consecuencia. Si se consideran pares sucesivos de llamadas de la función Random como las coordenadas de un punto en el plano, estos puntos son ``puntos al azar'' en $ [0,1]^2$ (ver la figura 1). El significado preciso es que estos puntos son independientes y además:

$\displaystyle \forall a, b\;,\; 0\leq a <b \leq 1\;,\;
\forall c,d\;,\; 0\leq c<d \leq 1\;,
$

$\displaystyle \mathbb {P}[$ ( Random$ _1$, Random$ _2$)$\displaystyle \in ]a,b]\times ]c,d]~]
=(b-a)(d-c)
\;.
$

Gráfico 1: Puntos al azar en el cuadrado unitario.


La probabilidad de que un punto, cuyas coordenadas son obtenidas a partir de la función Random, caiga en un cierto rectángulo es igual a la superficie del rectángulo. Esto puede, evidentemente, extenderse a cualquier dimensión. Tríos de llamadas sucesivas de Random, son las coordenadas de ``puntos al azar'' en el cubo $ [0,1]^3$, etc...

Proposición 2.1   Para todo $ k\in\mathbb {N}^*$, sean $ (R_1,\ldots ,R_k)$ $ k$ llamadas consecutivas de Random. Los postulados 1) y 2) implican que para todo rectángulo

$\displaystyle D=
]a_1,b_1]\times\cdots\times]a_k,b_k],$    donde $\displaystyle 0\leq a_i<b_i\leq 1~, \forall i=1,\ldots ,k~,
$

se tiene:

$\displaystyle \mathbb {P}[~(R_1,\ldots ,R_k)\in D~]
=(b_1-a_1)\cdots (b_k-a_k)
\;.
$


La probabilidad de que Random dé un valor específico es nula:

$\displaystyle \forall a\in [0,1] \,,\; \mathbb {P}[~$ Random$\displaystyle =a~]=0.
$

En efecto:

$\displaystyle \forall \varepsilon >0\,,\;
\mathbb {P}[~$ Random$\displaystyle =a~]
\leq \mathbb {P}[~$ Random$\displaystyle \in ]a-\varepsilon,~a]~]
=\varepsilon
\;.
$

Por tanto:
$\displaystyle \mathbb {P}[~$ Random $\displaystyle \in~ ]a,b]~]$ $\displaystyle =$ $\displaystyle \mathbb {P}[~$ Random$\displaystyle \in [a,b]~]$  
  $\displaystyle =$ $\displaystyle \mathbb {P}[~$ Random$\displaystyle \in [a,b[~]$  
  $\displaystyle =$ $\displaystyle \mathbb {P}[~$ Random$\displaystyle \in ]a,b[~]
\;.$  


Al admitir a la vez que Random puede tomar un número infinito de valores diferentes y que la probabilidad de tomar un valor especifico es nula, tenemos una paradoja. Veremos en situaciones prácticas que la situación es ligeramente diferente, sin que por ello nos cuestionemos los postulados de la definición de Random. Una vez aceptados los dos postulados, todo análisis de algoritmo que contiene a Random, es una demostración matemática tan rigurosa como otra.

Ejemplo 1: Lanzamiento del dado.


$\displaystyle D\longleftarrow$   Int$\displaystyle ($    Random$\displaystyle *6 )+1
$


Para todo $ k\in \{1,\ldots , 6\}$,

$\displaystyle \mathbb {P}[D=k]$ $\displaystyle =$ $\displaystyle \mathbb {P}[$ Int( Random$\displaystyle * 6)=k-1~]$  
  $\displaystyle =$ $\displaystyle \mathbb {P}[\,$ Random$\displaystyle * 6\in [k-1,k[~]$  
  $\displaystyle =$ $\displaystyle \mathbb {P}[$ Random$\displaystyle \in [(k-1)/6, ~k/6[ ~]$  
  $\displaystyle =$ $\displaystyle \frac{k}{6}-\frac{k\!-\!1}{6}=\frac{1}{6}\;.$  


No hay que deducir de este ejemplo que Int $ ($ Random$ *k)$ es la mejor forma de obtener un entero al azar entre 0 y $ k\!-\!1$. Los generadores de números aleatorios usuales permiten tener tipos diferentes de números como resultado: números reales distribuidos uniformemente en el intervalo $ [0,1]$, booleanos, enteros y aún complejos.

Ejemplo 2: (Int $ (\,\cdot\,)$ denota la parte entera).

$\displaystyle X\longleftarrow ($Int$\displaystyle ( \underbrace {\mbox{\tt Random} }_{R_1}
* 3))* (\mbox{Int}( \underbrace {\mbox{\tt Random}}_{R_2}* 2))\;.
$

La variable $ X$ toma los valores 0, $ 1$ o $ 2$.
$\displaystyle \mathbb {P}[X=2]$ $\displaystyle =$ $\displaystyle \mathbb {P}[$ Int$\displaystyle (R_1* 3)=2$    y Int$\displaystyle (R_2* 2)=1~]$  
  $\displaystyle =$ $\displaystyle \mathbb {P}[~R_1\in [2/3,~1[$    y $\displaystyle R_2\in[1/2,~1[~]$  
  $\displaystyle =$ $\displaystyle \left(1-\frac{2}{3}\right)\left(1-\frac{1}{2}\right)$  
  $\displaystyle =$ $\displaystyle \frac{1}{6}\;.$  


Se demuestra igualmente que $ \mathbb {P}[X=1]=1/6$ y $ \mathbb {P}[X=0]=4/6$.

Observación: Contrario a las apariencias, el algoritmo anterior no da valores entre $ 3$ y $ 6$. Teóricamente, la probabilidad de que Random dé el valor $ 1$ es nula. En la práctica, los generadores están, en general, hechos de manera tal que nunca dan ni 0 ni $ 1$.

Los generadores aleatorios permiten simular sucesiones de experimentos aleatorios independientes y por tanto podemos calcular, de forma aproximada, probabilidades aplicando la Ley de los Grandes Números. El algoritmo genérico de cálculo de una frecuencia experimental tomará la siguiente forma.

$ n_A\leftarrow 0$
Repetir $ n$ veces
experimento
Si ($ A$ se realiza) entonces $ n_A\leftarrow n_A+1$
finSi
finRepetir
$ f_A\leftarrow n_A/n\;.$

La variable $ f_A$ es la frecuencia experimental del evento $ A$ en los $ n$ experimentos.

Ejemplo : El experimento es lanzar un dado. El evento $ A$ es: ``El resultado es al menos igual a $ 4$''.

$ n_A\leftarrow 0$
Repetir $ n$ veces
$ D\leftarrow$   Int$ ($Random$ * 6)+1$      (* lanzar un dado *)
Si ($ D\geq 4$) entonces $ n_A\leftarrow n_A+1$
finSi
finRepetir
$ f_A\leftarrow n_A/n\;.$

Al salir de este algoritmo, $ f_A$ contiene un número que estará más cerca de $ 0.5$ en dependencia de cuan grande es el valor de $ n$ que se toma. Mientras mayor sea el número de experimentos, más preciso es el resultado.



Sección : Simulación, modelos y realidad
Previo : Modelos
Siguiente : Sucesiones uniformes