Está en la página 1de 28

Captulo 4

Generaci
on de n
umeros aleatorios no
uniformes.
4.1.

Generaci
on de n
umeros aleatorios no uniformes

4.1.1.

M
etodo General

En esta seccion vamos a describir tecnicas para generar valores para una variable
aleatoria de f.d.p. dada. Sunpondremos que, tal y como se explica en otro captulo, hay
una manera de generar numeros aleatorios uniformemente distribuidos en el intervalo
[0, 1]. El metodo generico hace uso del siguiente resultado:
Teorema.- Si x
es una variable aleatoria de funcion de distribucion Fx (x), entonces
u
= Fx (
x) es una variable aleatoria uniformemente distribuida en el intervalo (0, 1)
(variable U (0, 1)). En efecto, la funcion de distribucion de u
es:
Fu (u) = P (
u u) = P (Fx (
x) u)

(4.1)

La funcion Fx (x) es monotona creciente (excepto quizas en intervalos en los que es


constante, dichos intervalos corresponden a valores de la v.a. de probabilidad 0 y no son,
pues, relevantes), de manera que existe la funcion inversa Fx1 y podemos escribir la
relacion anterior como:
Fu (u) = P (
x Fx1 (u)) = Fx (Fx1(u)) = u

(4.2)

que es la funcion de distribucion de una variable aleatoria U (0, 1). Podemos escribir
x
= max{x|x = Fx1 (u)}.
1), entonces la
Este teorema, ledo al reves, nos dice que si u
es una v.a. U(0,
1
v.a. x
= Fx (
u) tiene a Fx (x) como funcion de distribucion. Veamos una aplicacion.
Deseamos generar numeros aleatorios con una distribucion exponencial, es decir la fdp
es fx (x) = a exp(ax), con a una constante dada positiva. La funcion de distribucion
es:
! x
Fx (x) =
fx (x) dx = 1 exp(ax)
(4.3)

52

Generaci
on de n
umeros aleatorios no uniformes.

log(1 u). De manera que para obtener


Y la funcion inversa es x = Fx1 (u) = 1
a
numeros aleatorios distribuidos con una distribucion exponencial hay que tomar numeros
1) y aplicar la funcion x = 1 log(1 u). Se puede usar el hecho de
u que sean U(0,
a
que v
= 1u
es tambien, obviamente, una variable U (0, 1) y por lo tanto se puede
usar sencillamente la relacion:
1
x=
log(v)
(4.4)
a
para generar un numero aleatorio distribuido exponencialmente. Un problema con este
caso es que puede aparecer la expresion log(0). Aqu vemos la necesidad de escibir el
numero uniforme u como (m + 0,5)/M ya que ello previene la aparicion de 0.
Podemos aplicar este metodo para la generacion de numeros aleatorios con la distribucion de Cauchy:
1 1
(4.5)
fx (x) =
1 + x2
La funcion de distribucion es:
! x
! x
1 1
1 1
Fx (x) =
fx (x) dx =
= + arctan(x)
(4.6)
2
2

1 + x

de manera la que funcion inversa es:

1
x = tan((u ))
(4.7)
2
As para obtener numeros aleatorios con la distribucion de Cauchy hay que generar
numeros uniformes u y aplicar la transformacion x = tan((u 21 )).
Un ultimo ejemplo lo consituye la funcion de densidad:
1 2

fr(r) = re 2 r ,

0r

(4.8)

La funcion de distribucion es:


Fr(r) =

1 2

fr(r) dr = 1 e 2 r

(4.9)

de manera que la funcion inversa es


"
"
r = 2 log(1 u) 2 log(u)

(4.10)

La funcion inversa toma solamente dos valores:


&
0 u<1p
1
Fx (u) =
1 u 1p

(4.12)

Esta formula sera de interes mas adelante al discutir la distribucion gaussiana.


La formula general anterior tambien sirve para el caso de una distribucion discreta.
Consideremos el caso de la distribucion de Bernouilli. La funcion de distribucion es:

x<0
0
1

p
0
x<1
Fx (x) =
(4.11)

1
x1

de manera que el algoritmo para generar una variable aleatoria de Bernouilli es el siguiente:

4.1 Generaci
on de n
umeros aleatorios no uniformes

53

if (ran_u().lt.1-p) then
x=0
else
x=1
endif
Si deseamos generar un vector (
x1 , x
2 , ...., x
n ) de variables aleatorias con una funcion
de densidad conjunta fx1 ,...,xn (x1 , ..., x
n ) podemos hacerlo basandonos en la formula que
relaciona la funcion de densidad conjunta con las condicionadas:
fx1 ,...,xn (x1 , ..., xn ) = fx1 (x1 )fx2 (x2 |x1 ) . . . fxn (xn |x1 , ..., xn1 )

(4.13)

Un teorema analogo al demostrado para el caso de una v.a. nos dice que si u
1 , ..., u
n ) es

un vector de n v.a. U (0, 1) independientes, entonces el vector (x1 , ..., x


n ) solucion del
siguiente sistema de ecuaciones, esta distribuido de acuerdo con fx1 ,...,xn (x1 , ..., xn ):
Fx1 (x1 ) = u
1
2
Fx2 (x2 |x1 ) = u

(4.14)

n
Fxn (xn |x1 , ..., xn1 ) = u
Hay que tener en cuenta al aplicar este metodo que hay n! maneras de ordenar las
variables aleatorias x
1 , ..., x
n y que las formulas resultantes pueden, aun siendo todas
ellas validas, diferir mucho en su aplicacion practica. De todas maneras, este metodo de
generar vectores de v.a.s no suele ser de mucha aplicabilidad ya que suele resultar difcil
calcular las funciones de distribucion condicionadas y resolver el correspondiente sistema
de ecuaciones.

4.1.2.

Inversi
on num
erica

El problema principal del metodo general explicado es cuando la funcion Fx1 no


se puede expresar en terminos de funciones elementales o cuando su forma analtica es
demasiado complicada para ser implementada eficientemente en el ordenador.
El truco estandard para evitar el calculo de la uncion inversa F 1 () cada vez que hace
falta un numero aleatorio es dividir el intervalo [0, 1] en M subintervalos interval [0, 1] in
M subintervals [ Mi , i+1
]
y tabular la funcion de distribucion de probabilidad
M i=0,1,...,M 1
inversa en los puntos i = i/M, es decir, calcular y guardar xi = F 1 (i/M) para
i = 0, ..., M. Se substituye entonces la verdadera funcion distribucion de probabilidad
Fx (x) por su aproximacion linear a trozos entre los puntos [ Mi , i+1
]. Se genera entonces
M
un numero aleatorio u
de una distribucion uniforme U (0, 1) y se usa la siguiente formula
de interpolacion lineal para calcular el numero aleatorio x = Fx1 (
u):
x = (M u
i)xi+1 + (i + 1 M u
)xi

(4.1)

donde i es tal que el numero u


pertenece al intervalo [ Mi , i+1
), or i = [M u
], (parte
M
entera de M u
). Si este metodo de inversion numerica producira numeros aleatorios de

54

Generaci
on de n
umeros aleatorios no uniformes.

suficiente calidad dependera de la bondad de la aproximacion de la funcion Fx (x) por


una funcion lineal a trozos. Esto se determina por la suavidad de la funcion Fx (x) y
por el numero de subdivisiones M del intervalo [0, 1]. Por otra parte, el metodo de
inversion numerica es rapido, ya que solo involucra sumas y multiplicaciones y puede ser
vectorizado en la mayora de los compiladores vectoriales actuales. El unico tiempo extra
requerido es el calculo de los numeros xi una vez.

4.1.3.

Cambio de variables

Recordemos primero que relacion hay entre las f.d.ps de dos variables aleatorias. Sea
y = y(x) una funcion de la variable x. La relacion entre las funciones de densidad de
probabilidad de las v.a.s y
yx
es la siguiente:
fy (y) =

' fx (xi )
dy
|x=xi
| dx
i

(4.1)

donde xi son las soluciones de la ecuacion y = y(x). El caso mas sencillo es el de


transformacion lineal y = ax + b. En este caso, la solucion de la ecuacion es unica
x = (y b)/a y la funcion densidad de y
se escribe como:
fy (y) =

1
yb
fx (
)
|a|
a

(4.2)

De manera que si x
es U (0, 1), entonces y
es U (b, a + b) para a > 0 o U (a + b, b) para
1), el
a < 0 (ver la figura 1). Si, por otra parte, x
fuera una variable gaussiana G(0,
a).
cambio y
= ax + b produce una variable gaussiana G(b,
a
El cambio y = x produce la siguiente fdp:
fy (y) =

1 1 1
ya
|a|

(4.3)

valida para 0 < y < 1 si a > 0 o para 1 < y < si a < 0. Este cambio de variables
permite, pues, generar cualquier distribucion de la forma fx (x) = (1 + )x sin mas
que usar la transformacion x
=u
a con a = 1/( + 1), siendo u
una variable aleatoria

U (0, 1).
Un resultado parecido se obtiene para funciones de varias variables: si x
1 , ..., x
n
son v.a.s con funcion de densidad conjunta fx1 ,...,xn (x1 , ..., xn ) y definimos n variables
aleatorias como funciones de ellas: y
i = yi(
x1 , ..., x
n ), i = 1, ..., n entonces la funcion
de densidad conjunta de las v.a.s y
1 , ..., y
n viene dada por:
' ( x1 , ..., xn )
fy1 ,...,yn (y1 , ..., yn ) =
J
fx1 ,...,xn (x1 , ..., xn )
(4.4)
y1 , ..., yn
donde la suma se extiende sobre todas las soluciones del conjunto de ecuaciones: yi =
yi (x1 , ..., xn ), i = 1, ..., n.

4.1 Generaci
on de n
umeros aleatorios no uniformes

4.1.4.

55

Distribucion Gaussiana

La distribucion gaussiana es una de las mas importantes y por eso vamos a tratar
en detalle la cuestion de generacion de numeros aleatorios gaussianos. Empecemos con
una unica variable aleatoria independiente gaussiana, x
, de media y varianza 2 , su
funcion densidad de probabilidad es:
(x)2
1
fx (x) = e 22
2

(4.1)

Tal como vimos con anterioridad, es suficiente considerar el caso de una variable aleatoria
gaussiana de media 0 y varianza 1,
z, ya que a partir de aqui podemos obtener la v.a.
x
=
z + . La funcion densidad de probabilidad de
z es, sencillamente,
z2
1
fz(z) = e 2
2

(4.2)

El metodo general involucra la funcion de distribucion inversa, que en este caso se calcula
mediante:
! z
! z
z2
1
z
1
e 2 dz = (1 + erf( ))
Fz(z) =
fz(z) dz =
(4.3)
2
2
2

de manera que un valor de la v.a.


z se obtiene mediante:

z = 2erf 1 (2u 1)

(4.4)

1). La funcion erf 1 es la funcion error inversa. La


donde u es un valor de una v.a. U(0,
expresion anterior es exacta pero no es practica, ya que la funcion error inversa no suele
formar parte de las funciones intrnsecas de un lenguaje de programacion. Sin embargo,
hay que tener en cuenta que dicha funcion existe en muchas libreras cientficas (y esta,
por supuesto tabulada). Si consideramos la librera de rutinas NAG, la programacion de
un numero aleatorio gaussiano (que llamaremos funcion ran g() ) se consigue mediante
el sencillo programa:
function ran_g()
ran_g() = sqrt(2.)*go5cef(2*ran_u()-1,ifail)
return
end
De hecho, existen buenas aproximaciones a la funcion error inversa. Mencionaremos la
siguiente ([17]), z = Fz1 (u) se puede aproximar
xt

c0 + c1 t + c2 t2
1 + d1 t + d2 t2 + d3 t3

(4.5)

donde
t=

"

2 log(1 u)

(4.6)

y c0 =2.515517, c1 =0.802853, c2 =0.010328, d1=1.432788, d2 =0.189269 y d3 =0.001308,


con un error menor que 4,5 104 si 0,5 u 1,0. Cuando 0,0 < u < 0,5 podemos
usar el que la fistribucion gaussiana es simetrica alrededor de x = 0 para escribir el
siguiente algoritmo:

56

Generaci
on de n
umeros aleatorios no uniformes.

function ran_g()
data c0,c1,c2/2.515517,0.802853,0.010328/
data d1,d2,d3/1.432788,0.189269,0.001308/
u=ran_u()
if (u.gt.0.5) then
t=sqrt(-2.0*log(1.-u))
ran_g=t-(c0+t*(c1+c2*t))/(1.0+t*(d1+t*(d2+t*d3)))
else
t=sqrt(-2.0*log(u))
ran_g=-t+(c0+t*(c1+c2*t))/(1.0+t*(d1+t*(d2+t*d3)))
endif
return
end
Sin embargo, la aproximacion anterior y otras aproximaciones involucran demasiado
calculo (hay que calcular una raz cuadrada y un logaritmo), de manera que el algoritmo
resultante es demasiado lento aparte de que el error en la aproximacion precedente,
aunque pequeno, puede ser importante en algun problema.
Esta situacion, que es bastante comun en la generacion de numeros aleatorios, de
que la funcion de distribucion inversa sea de difcil generacion, tiene aqu una solucion
en el que se conoce como algoritmo de Box-Muller-Wiener (BMW). Se parte de dos
variables aleatorias gaussianas x
1 , x
2 (de media cero y varianza unidad) independientes.
De manera que su funcion de densidad conjunta es:
1 x21 +x22
fx1 ,x2 (x1 , x2 ) = fx1 (x1 )fx2 (x2 ) =
e 2
2

(4.7)

Se pasa ahora a coordenadas polares:

x
1 =
r cos()

x
2 =
r sin()

(4.8)

La funcion densida conjunta de


r y es :
)
(
x1 , x2
fx1 ,x2 (x1 , x2 )
fr,(r, ) = J
r,

(4.9)

y, de acuerdo con la ecuacion 4.7, y considerando que el jacobiano del cambio de cartesianas a polares planas vale r, se obtiene:
fr,(r, ) =

1 r2
re 2
2

(4.10)

Que se puede escribir de la forma:


fr,(r, ) = fr(r)f()
con

r2

fr(r) = re 2

(4.11)
(4.12)

4.1 Generaci
on de n
umeros aleatorios no uniformes

57

1
(4.13)
2
lo que demuestra que
r y son variables aleatorias independientes. es una variable aleatoria uniformemente distribuida en el intervalo [0, 2] que se puede generar sencillamente
como:
= 2
u
(4.14)
donde u
es una variable U (0, 1). En una seccion anterior se demostro que la v.a.
r se
puede generar mediante:
"
v)
(4.15)

r = 2 log(
f() =

de manera que las v.a. x


1 , x
2 se calculan como:
"
x
1 = 2 log(
v) cos(2
u)
"
x
2 = 2 log(
v) sin(2
u)

(4.16)
(4.17)

Estas expresiones son el celebrado algoritmo de Box-Muller-Wiener.


La ventaja principal de este algoritmo es que es exacto, produciendo dos v.a.s gaussianas independiente a partir de dos v.a. uniformes independientes. Ademas, es facilmente
implementable, ya que involucra solamente funciones elementales presentes en cualquier
lenguaje de programacion. Un serio problema, resulta en que requiere el calculo de las
funciones seno, coseno, logaritmo y raz cuadrada, dando lugar a un algoritmo bastante
lento. Se puede evitar el calcular las funciones seno y coseno utilizando un algoritmo de
rechazo (ver mas adelante). Sin embargo, esto produce un algoritmo que es tpicamente
20 % mas rapido que BMW en un ordenador escalar, pero tiene la desventaja de que no
es eficientemente vectorizable. Se han propuesto otros muchos algoritmos para generar
numeros aleatorios gaussianos, pero todos ellos tienen en comun el hecho de no ser
vectorizables. Cuando se necesite numeros gaussianos en los que no sea importante los
detalles de las colas de la distribucion gaussiana, es mas conveniente usar el metodo de
inversion numerica tal y como se describe en el apendice.
Aunque no recomendamos su uso, mencionaremos tambien que se ha propuesto el
uso del teorema del lmite central para generar v.a. gaussianas. El algoritmo se basa en
el hecho de que la v.a. z definida como:
,
* + N
N
12 '
u
k

z=
(4.18)
N k=1
2

1) tiende a una gaussiana en el lte N . El algoritmo


donde las u
k son variables U(0,
se usa tpicamente con N = 12 por razones obvias.
Vamos a discutir ahora el caso de generacion de un vector de n v.a.s (
x1 , ..., x
n )
conjuntamente gaussianas. Recordemos que la funcion de densidad conjunta viene dada
por la expresion:
n
n
|A|
1 ''
exp

(xi i )Aij (xj j )


(4.19)
fx1 ,...,xn (x1 , x2 , ..., xn ) =
(2)n
2 i=1 j=1

58

Generaci
on de n
umeros aleatorios no uniformes.

donde la matriz A es la inversa de la matriz de correlaciones Cij = *(


xi i )(
xj j )+.
El metodo para generar las v.a.s (
x1 , ..., x
n ) recuerda en su estructura al proceso de
ortonormalizacion de Schmidt. Se parte de n v.as gaussianas
z1 , ...,
zn independientes,
de media cero y varianza unidad, i.e. *
zi + = 0, *
zi
zj + = ij Se utilizara aqu el hecho de
que una combinacion lineal de v.a. gaussianas es tambien una v.a. gaussiana. La primera
variable x
1 se escribe como:
x
1 = b11
z1 + 1
(4.20)
1/2

es obvio que *
x1 + = 1 y que *(x1 1 )2 + = C11 = b211 lo que conduce a b11 = C11 .
Escribimos la segunda variable como
x
2 = b21
z1 + b22
z2 + 2

(4.21)

que verifica *
x2 + = 2 . Las constantes b21 y b22 se determinan pidiendo que se satisfagan
las condiciones:
*(
x1 1 )(
x2 2 )+ = b11 b21 = C12
*(
x2 2 )2 + = b221 + b222 = C22
lo que lleva a

C12
C12
= 1/2
b11
C11
(
)1/2
2
.
/
C12
2 1/2
= C22 b21
= C22
C11
b21 =

b22

(4.22)

(4.23)
(4.24)

Este proceso se puede continuar escribiendo:


x
j =

j
'

bji
zi + j

(4.25)

i=1

y calculando las constantes bij mediante las relaciones recurrentes:


0
Cji i1
k=1 bik bjk
j = 1 . . . , n, i = 1, . . . , j 1
bji =
bii
1
2
j1
2
'
3
bjj = Cjj
b2jk
k=1

La implementacion del algoritmo es sencilla:

do 1 j=1,n
do 1 i=1,j
r=c(j,i)
do 2 k=1,i-1
r=r-b(j,k)*b(i,k)
continue

(4.26)

4.1 Generaci
on de n
umeros aleatorios no uniformes

4.1.5.

59

if (i.lt.j) then
b(j,i)=r/b(i,i)
else
b(j,j)=sqrt(r)
endif
continue

Composici
on de variables

A veces, una transformacion de variables lleva a distribuciones interesantes, como


fue el caso de Box-Muller-Wiener. Veamos ahora otro ejemplo: consideremos x
1 , ...
xn
v.a.s independientes cuyas funciones de distribucion respectivas son: F1 (x1 ), ..., Fn (xn ).
Calculemos la funcion de distribucion de la variable aleatoria maximo:

z = max(
x1 , . . . , x
n )

(4.1)

Tenemos Fz(z) = P (
z z), pero se verificara que
z z si y solo si se tiene x
i z, i.
De manera que
P (
z z) = P (
x1 z, . . . , x
n z) = P (
x1 z) . . . P (
xn z)

(4.2)

la ultima igualdad proviene de que las v.a. x


i son independientes. As tenemos
Fz(z) = F1 (z) . . . Fn (z)

(4.3)

En el caso que todas la variables x


i esten uniformemente distribuidas en el intervalo
[0, 1], se tiene que Fi (z) = z, i,de manera que la funcion de distribucion de
z es:
Fz(z) = z n ,

z [0, 1]

(4.4)

y la correspondiente funcion de densidad de probabilidad es:


f (z) = nz n1

(4.5)

Esta relacion constituye un algoritmo alternativo a la generacion de v.a.s con la fp


f (z) = nz n1 . Vimos con anterioridad que la transformacion
z=u
1/n generaba dichos
numeros aleatorios. Vemos ahora que una alternativa consiste en generar n numeros
1) y calcular su maximo. Si n no es demasiado grande, este metodo es
aleatorios U(0,
mas rapido que el anterior que involucra una potenciacion no entera (en la practica, una
exponencial y un logaritmo).
Hay muchos casos en los que es posible separar la funcion de densidad de probabilidad
que nos interesa en combinacion lineal de f.d.p.s que sabemos como generar. Mas en
concreto, puede ser posible escribir:
'
fx (x) =
i fi (x)
(4.6)
i

60

Generaci
on de n
umeros aleatorios no uniformes.

donde fi (x) son f.d.p.s. De las condiciones de normalizacion para fx (x) y para fi (x) se
deduce facilmente que se ha de tener
'
i = 1
(4.7)
i

si, ademas, se verifica que i > 0 i, entonces es posible interpretar a i como las
probabilidades de una variable aleatoria
z discreta que toma valores enteros, de fdp:
'
fz(z) =
i (z i)
(4.8)
i

la generacion de un valor de la v.a. x


procede en dos partes: primero se selecciona un
valor entero de acuerdo con la v.a.
z, por ejemplo i, y, a continuacion, se selecciona un
valor de la v.a. definida por fi (x). La funcion densidad de la v.a. resultante, es:
'
'
fx (x) =
Prob(
z = i)f (x|
z = i) =
i fi (x)
(4.9)
i

que es justamente la que queramos. Veamos un ejemplo, supongamos que queremos


generar valores de una v.a. x
distribuida de acuerdo con
5
fx (x) = (1 + x4 ),
6

0x1

(4.10)

Podemos escribirla de la siguiente manera:


1
5
fx (x) = 1 f1 (x) + 2 f2 (x) = 1 + (5x4 )
6
6

(4.11)

la funcion f1 (x) representa sencillamente una v.a. uniforme en (0, 1). La funcion f2 (x) se
puede muestrear facilmente mediante el cambio x = u1/5 (con u una variable U (0, 1)).
El algoritmo para generar la fdp pedida sera:
if (ran_u().gt.1./6.) then
x=ran_u()
else
x=ran_u()**(1./5.)
endif
Es obvio que este algoritmo puede escribirse en la siguiente manera equivalente:
x=ran_u()
if (ran_u().lt.1./6.) x=x**(1./5.)
A veces, es necesario reordenar la expresion que define a fx (x) para llegar a escribirla
de la manera dada en la ecuacion (4.9) (recordamos que es esencial que las constantes
i sean todas positivas). Consideremos, por ejemplo, la fdp
4
fx (x) = (1 + 3x2 x3 )
7

(4.12)

4.1 Generaci
on de n
umeros aleatorios no uniformes

61

se puede escribir como:


6
1
fx (x) = (4(1 x)3 ) + (2x)
7
7

(4.13)

de manera que 1 = 1/7, 2 = 6/7, f1 (x) = 4(1 x)3 , f2 (x) = 2x, f1 (x) y f2 (x) se
pueden muestrear facilmente como (1 u)1/4 u1/4 y u1/2 . El algoritmo es:
x=sqrt(ran_u())
if (ran_u().lt.1./7.) x=sqrt(x)

4.1.6.

M
etodos de Rechazo

La caracterstica esencial de los metodos de rechazo es que se propone un valor para la


variable aleatoria x
que es aceptado o rechazado de acuerdo con una cierta probabilidad.
Entenderemos mejor la filosofa del metodo con un ejemplo concreto. Supongamos que
queremos muestrear la fdp.
x2
fx (x) = C exp( )
2

1x1

(4.1)

es una gaussiana cortada. Veremos que no hace falta conocer el valor de la constante de
normalizacion C siendo esta una caracterstica general de estos metodos: no es preciso
normalizar a priori la funcion densidad de probabilidad. De acuerdo con la idea intuitiva
del significado de una fdp, debiera ser mas probable obtener valores x
donde fx (x)
sea mayor. Lo que vamos a hacer es proponer cualquier valor en el intervalo (1, 1)
con la misma probabilidad, pero el valor propuesto sera aceptado con una probabilidad
proporcional a fx (x). Parece claro, as que los valores x que hagan fx (x) mayor seran
aceptados mas veces que los que hagan fx (x) menor, que es lo que se desea. Resumiendo,
1.- Proponer x de la distribucion uniforme en (-1,1)
2
2.- Aceptar con probabilidad proporcional a fx (x) exp( x2 )
En el paso 2, hay que aceptar co probabilidad proporcional a fx (x), es decir con
probabilidad fx (x). Es esencial que esta probabilidad se mantenga entre 0 y 1, de
manera que este metodo requiere tomar max fx (x). En el ejemplo que nos ocupa,
2
el valor maximo de exp( x2 ) es 1 con lo que podemos tomar sencillamente = 1/C.
Como se lleva a cabo el proceso de aceptacion? Dicho proceso es sencillamente un
proceso de Bernouilli (o se acepta o no se acepta) de probabilidad fx (x) = de manera
que se aceptara si el valor de una variable aleatoria U (0, 1) es menor que fx (x) =
2
2
exp( x2 ) y, consecuentemente, se rechazara si el mayor que exp( x2 ). El algoritmo en
este caso sera:
1

x=2*ran_u()-1
if(ran_u().gt.exp(-0.5*x*x)) goto 1

Vemos en este ejemplo la potencia del metodo. Se muestrea con una facilidad asombrosa
(2 lneas de fortran) una distribucion que hubiera sido muy difcil de generar por otro
metodo (fijemonos en que no es una gaussiana ya que esta limitada al intervalo (1, 1)).

62

Generaci
on de n
umeros aleatorios no uniformes.

Veamos estos metodos en general. Se trata de


(a) Proponer un valor para x
de acuerdo con una fdp gx (x)
(b) Aceptar el valor propuesto con probabilidad h(x). Para este paso es necesario
poder interpretar a h(x) como una probabilidad, de manera que se requiere que 0
h(x) 1, x.
(en el caso anterior, gx (x) era una distribucion uniforme en (1, 1)) y h(x) =
2
exp( x2 )). El segundo paso se puede interpretar como una variable de Bernouilli,
y, que
toma el valor 1 con probabilidad h(x). En el proceso de rechazo, lo que obtenemos son
valores de la v.a.a x
distribuida de acuerdo con fx (x|
y = 1). De acuerdo con el teorema
de Bayes para la f.d.p. se tiene:
fxy (x, 1)
fy (x, 1) dx
x

(4.2)

fx (x|
y = 1) = 4

Pero segun lo visto para fdps condicionadas, se tiene:


fxy (x, 1) = gx (x)prob(
y = 1|x) = gx (x)h(x)

(4.3)

lo que lleva a que la fdp que se obtiene con el metodo de muestreo es:
h(x)gx (x)
h(x)gx (x) dx

fx (x) = 4

(4.4)

Vemos que, como debe ser, esta funcion densidad de probabilidad esta convenientemente
normalizada. Lo unico necesario, pues, es escoger gx (x) y h(x) de manera que fx (x) =
Agx (x)h(x), la normalizacion sera hecha de manera automatica. Fijemenos que esto es
equivalente a pedir que:
gx (x)h(x)fx (y) = gx (y)h(y)fx (y)

x, y

(4.5)

la llamada condicion de balance detallado.


La eficiencia del metodo de rechazo viene dada por la probabilidad de aceptacion.
El metodo sera poco eficiente si necesitamos proponer muchos valores antes de aceptar
uno. La eficiencia se mide pues, por la probabilidad de aceptacion,' que es:
!
!
'=
P (
y = 1|x)gx (x) dx =
h(x)gx (x) dx
(4.6)

vemos claramente que la eficiencia es tanto mayor cuanto mayor sea h(x) de manera que
conviene tomar h(x) tan grande como sea posible manteniendo la condicion 0 h(x)
1. Es obvio tambien de la expresion precedente que la probabilidad de aceptacion, '
esta relacionada con la constante de normalizacion que no necesitaba ser conocida. As,
en el ejemplo anterior, podemos relacionar facilmente:
! 1
x2
1
1
exp( ) dx =
(4.7)
'=
2
2C
1 2
de donde se obtiene
= 1/(2'). Analogamente, sabiendo que la constante de integracion
C
vale C = (erf (1/ 2) 2)1 = 0,000 se deduce ' = 0000.

4.1 Generaci
on de n
umeros aleatorios no uniformes

63

Veamos otros ejemplos:


a) podemos generar la distribucion del ejemplo anterior mediante la siguiente eleccion
de funciones:
1
x2
gx (x) = exp( ) x (, )
2
2

(4.8)

y
h(x) = 1 si x [1, 1]
h(x) = 0 en caso contrario

(4.9)

Esto quiere decir: generar x de acuerdo con una distribucion gaussiana usual y aceptar
con probabilidad 1 (i.e. aceptar sin mas) si el valor para x esta en el intervalo [1, 1].
El algoritmo sera:
1

x=gauss()
if(abs(x).gt.1.) goto 1
la eficiencia de este metodo sera:
! 1
"
x2
1

exp( ) dx = erf(1/ (2)) = 0,000


'=
2
2
1

(4.10)

Si queremos comparar la eficiencia de estemetodo con la del anterior deberamos tener en


cuenta la diferencia de tiempo para generar un numero aleatorio con los dos algoritmos.
b) Supongamos que deseamos generar valores de la v.a. x
distribuida de acuerdo con
fx (x) = C exp(

x2
x4 ) x (, )
2

(4.11)

Parece obvio escoger las funciones:


x2
1
gx (x) = exp( ) x (, )
2
2

(4.12)

h(x) = exp(x4 )

(4.13)

y
que cumple la condicion 0 h(x) 1. El algoritmo en este caso sera:
1

x=gauss()
if(ran_u().gt.exp(-x**4) goto 1

c) Como ultimo ejemplo del metodo de rechazo, veamos como generar un punto
uniformemente al azar en el disco de centro (0, 0) y radio 1, es decir:
&
C si (x, y) D(0, 1)
fxy (x, y) =
(4.14)
0 en caso contrario

64

Generaci
on de n
umeros aleatorios no uniformes.

no es preciso conocer el valor de la constante C (que vale 1/, no obstante). Tomamos


las siguientes funciones:
g(x, y) = 1/4 (x, y) [1, 1] [1, 1]

(4.15)

y
h(x, y) =

&

1 si (x, y) D(0, 1)
0 en caso contrario

(4.16)

Es decir, que generamos un punto al azar en el cuadrado [1, 1] [1, 1], lo que
se hace facilmente generando dos v.a. independientes cada una de ellas en el intervalo
[1, 1] y aceptando el punto si pertenece al disco D(0, 1). El algoritmo es el siguiente:
1

x=2*ran_u()-1
y=2*ran_u()-1
r2=x*x+y*y
if (r2.gt.1.) goto 1
r=sqrt(r2)
c=x/r
s=y/r

las dos ultimas lneas calculan el seno y coseno respectivamente del angulo del punto
en cuestion, que es un angulo uniformemente distribuido en el intervalo [0, 2]. Esta
es una manera de calcular las funciones seno y coseno de un angulo uniformemente
distribuido en [0, 2] sin tener que calcular efectivamente las funciones seno y coseno.
El algoritmo alternativo es:
u=2*pi*ran_u()
c=cos(u)
s=sin(u)
que suele ser mas lento que el algoritmo de rechazo.

4.1.7.

Rechazo con repetici


on

Hay una variante del metodo de rechazo que consiste en que si el valor propuesto
no se acepta, entonces en vez de probar un nuevo valor se repite el valor anterior. Esto
produce valores de la variable aleatoria que estan correlacionados y puede parecer menos
interesante que la version usual de los metodos de rechazo. Sin embargo, en ciertos
ordenadores vectoriales la programacion del algoritmo de rechazo puede no ser eficiente
y este algoritmo modificado puede ser mejor. En este caso, la v.a x
n generada en la
repeticion n-esima del metodo tiene la siguiente funcion densidad de probabilidad:
fxn (x) = fxn (x|aceptar)p(aceptar) + fxn (x|rechazar)p(rechazar)

(4.17)

o bien usando (1.1.25):


fxn (x) = Prob(aceptar|x)gx (x) + fxn (x|rechazar)(1 p(aceptar))

(4.18)

4.1 Generaci
on de n
umeros aleatorios no uniformes

que es:
5
!
fxn (x) = h(x)gx (x) + fxn1 (x) 1

65

6
h(x)gx (x) dx

(4.19)

Esta
es una ecuacion de recurrencias que se resuelve facilmente. La solucion de la homogenea es:
fxn (x) = bn fx0
(4.20)
con
b=1

h(x)g(x) dx = 1 '

(4.21)

Y la soluccion particular fx (x) satisface:


5
!
fx (x) = h(x)gx (x) + fx (x) 1

es decir:

6
h(x)gx (x) dx

h(x)gx (x)
h(x)gx (x) dx

fx (x) = 4

De manera que la solucion completa es:


7
8
h(x)g
(x)
h(x)gx (x)
x

fxn (x) = (1 ')n fx0 4


+ 4
h(x)gx (x) dx
h(x)gx (x) dx

(4.22)

(4.23)

(4.24)

Podemos reescribir esto en terminos de la funcion que deseamos obtener fx (x):


fxn (x) = (1 ')n [fx0 fx (x)] + fx (x)

(4.25)

Dado que 0 < ' 1 se ve que la solucion tiende a la distribucion que queramos
muestrear en el lmite n independientemente de lo que valiera la distribucion
inicial fx0 :
(4.26)
limn fxn (x) = fx (x)
Observemos que si los numeros iniciales estan distribuidos de acuerdo con fx (x), es decir,
si fx0 (x) = fx (x) entonces se tiene fxn (x) = fx (x), n y los numeros que obtenemos
estan distribuidos segun la fdp que queremos desde el principio. Si, por otra parte, la
distribucion inicial no es igual a la distribucion fx (x) entonces el factor (1 ')n nos
asegura que la condicion inicial se perdera al cabo de un numero suficiente de pasos.
Este proceso de despreciar los n primeros pasos del algoritmo es lo que se conoce como
termalizacion y volveremos con mas detalle sobre este metodo al discutir el algoritmo de
Metropolis en el siguiente captulo. Mencionemos ahora que se puede escribir la ecuacion
(7.4) en la forma:
!
fxn (x) =

con:

f (x|y)fxn1 (y) dy

(4.27)

5
!
f (x|y) = h(x)g(x) + 1

6
h(x)g(x) dx (x y)

Dejamos para mas adelante la interpretacion de esta expresion.

(4.28)

66

4.1.8.

Generaci
on de n
umeros aleatorios no uniformes.

Generaci
on de distribuciones discretas

Una v.a. discreta se puede considerar como una v.a. continua con una funcion densidad que es una suma de funciones delta de Dirac. En principio, muchos de los resultados
de las secciones anteriores se aplican sin cambios sustanciales.
Sea una v.a. x
discreta que toma los valores xi , i = 0, 1, . . . con probabilidad pi , la
funcion de densidad es:
'
fx (x) =
pi (x xi )
(4.1)
i=0

La correspondiente funcion de distribucion es:


! x
m
'
Fx (x) =
fx (x) dx =
pi

(4.2)

i=0

aqu m representa el mayor numero entero para el que se tiene xm x. Esta


es una
funcion escalon. Para obtener valores de la v.a. x
distribuida de acuerdo con fx (x), de
acuerdo con el metodo general, hay que invertir la funcion Fx (x). En la practica, esto
equivale a determinar en que intervalo [xm , xm+1 ) pertenece Fx1 (u). En general, no es
facil obtener el intervalo [xm , xm+1 ), y el problema se plantea mejor como el de encontrar
el maximo valor de m para el que se verifica:
Fx (xm ) =

m
'
i=0

Veamos varios ejemplos aclaradores:

pi u

(4.3)

1.- Distribucion geometrica. xi puede tomar valores enteros xi = 0, 1, 2, ... con


probabilidades pi = pq i (con p + q = 1). La funcion de distribucion es:
Fx (m) =

m
'

pi =

i=0

m
'
i=0

pq i = 1 q m+1

(4.4)

de manera que en este caso es facil invertir la relacion que da el valor del numero aleatorio
buscado en funcion del valor u de una v.a. U (0, 1) como el maximo valor de m para el
que se verifica:
1 q m+1 u q m+1 1 u u
(4.5)
o bien:

log(u)
m=
log(q)

(4.6)

2.- Si el numero de valores que puede tomar la v.a. discreta x


es finito y no
demasiado grande, puede ser util ir comprobando uno a uno a qu`e intervalo pertenece
el numero aleatorio uniforme u. Por ejemplo, si tenemos la distribucion:
3
1
3
1
1
fx (x) = (x) + (x ) + (x 2) + x 4
8
8
2
8
8
se puede utilizar el siguiente programa:

(4.7)

4.1 Generaci
on de n
umeros aleatorios no uniformes

67

u=ran_u()
p1=1./8.
p2=p1+3./8.
p3=p2+3./8.
if (u.lt.p1) then
x=0.
elseif(u.lt.p2) then
x=0.5
elseif(u.lt.p3) then
x=2.
else
x=4.
endif
Si la v.a. consiste en N valores x1 , . . . , xN equiprobables, i.e. pi = N1 es muy facil
encontrar el intervalo [xm , xm+1 ) mediante la multiplicacion m = [Nu] + 1. As para
muestrear
10
'
1
fx (x) =
(x xi )
(4.8)
10
i=1

1) y tomar x = x[10u] + 1 Este metodo


basta con calcular u de una distribucion U(0,
supone que no puede salir exactamente el valor u = 1, lo que es cierto en los numeros
aleatorios uniformes de la forma u = m/M con 0 m M 1.
3.- Como ejemplo de la resolucion de la ecuacion 4.3 tomemos la distribucion de
Poisson de parametro :
fx (x) =

'
i=0

pi (x xi ),

pi = e

i
i!

(4.9)

Hay que calcular el maximo valor de m para el que se verifica:


m
'
i=0

alternativamente:

m
'
i
i=0

i
u
i!

(4.10)

ue

(4.11)

i!

En el calculo de la suma es conveniente usar la relacion:


i+1
i
=
(i + 1)!
i + 1 i!
que conduce al algoritmo siguiente:

(4.12)

68

100

Generaci
on de n
umeros aleatorios no uniformes.

function ipoisson(lambda)
real lambda
a1=1.0
a2=1.0
a=exp(lambda)*ran_u()
m=0
do 100 while(a2.lt.a)
a1=a1*lambda/(m+1)
a2=a2+a1
m=m+1
continue
ipoisson=m
return
end

En este procedimiento el numero medio de terminos en la suma es *x+. Suele ser


mas eficiente empezar la suma por la moda (valor mas probable) esto reduce el numero
de terminos de la suma que hay que hacer.
Ejemplo: distribucion binomial.
Tambien se puede tabular F (m) para los valores tpicos de m.
La distribucion de Poisson se puede hacer por otro metodo que vale la pena mencionar. Es conocido que si un proceso estocastico sigue una distribucion de Poisson de
parametro , entonces la variable aleatoria, t, tiempo entre dos sucesos, sigue una distribucion exponencial de parametro 1/, es decir, que su funcion densidad de probabilidad
es:
ft(
t) = et
(4.13)
valores ti de esta v.a. se consiguen mediante la transformacion:
ti =

1
log ui

(4.14)

donde ui son valores de una v.a. U (0, 1). Si xi son valores de una v.a. con distribucion
de Poisson, podemos escribir:
m
'
i=0

ti 1 <

m+1
'

ti

(4.15)

i=0

usando (4.14) tenemos:


m
m+1
'
1'
1
log ui 1 <
log ui

|lambda i=0
i=0

o bien

m
9
i=0

ui e

>

que se puede programar de la siguiente manera

m+1
9
i=0

ui

(4.16)

(4.17)

4.1 Generaci
on de n
umeros aleatorios no uniformes

100

69

function ipoisson(lambda)
real lambda
el=exp(-lambda)
a=ran_u()
m=0
do 100 while(a.gt.el)
a=a*ran_u()
m=m+1
continue
ipoisson=m
return
end

Otra manera de generar la distribucion de Poisson es utilizar, si es grande, que


se puede aproximar
por una Distribucion Gaussiana. Una aproximacion razonable es una

1/2, ).
G(
Por ultimo, mencionaremos que los metodos de rechazo pueden aplicarse tambien a
distribuciones discretas. Si generamos una valor de una v.a. de acuerdo con la f.d.p:
'
g(x) =
gi (x xi )
(4.18)
i

y el valor propuesto se acepta con probabilidad hi , donde se ha de verificar que 0 hi


1, i, entonces la distribucion resultante tiene por fdp:
0
hi gi (x xi )
fx (x) = i 0
(4.19)
i hi gi
y esta, por tanto, correctamente normalizada. Una distribucion conveniente para usar
como propuesta es la distribucion geometrica, que se puede generar facilmente.

4.1.9.

Ap
endice: Inversi
on num
erica para la distribuci
on gaussiana

We will now present an explicit implementation of the table inversion method to


generate Gaussian random numbers of mean 0 and variance 1. The Gaussian probability
density and probability distribution functions are given respectively by:

F (x) =

f (x) = "

1
(2)

x2
2

1
x
f (y)dy = (1 + erf( ))
2
2

(4.1)

Here erf(x) is the error function [17].


The first problem appears when one notices that, due to the fact that the Gaussian
distribution extends from to +, we have x0 = F 1 (0) = , xM = F 1 (1) =

70

Generaci
on de n
umeros aleatorios no uniformes.

and those numbers can not be used in the interpolation formula (4.1). A possible
solution consists in cutting-off the Gaussian distribution to some value , i.e. define the
distribution:

=0
x <

f(x)
= f (x) x
=0
x>

(4.2)

The constant , which is necessary for normalization, can be easily related to the
value of the cut-off :
!

1=
f(x)dx = erf( )
(4.3)
2

which yields:
=

1
erf( 2 )

(4.4)

The corresponding probability distribution function is given by:

=
0
x

F (x) = (F (x) F ()) x


=
1
x

(4.5)

A word of caution is necessary concerning the value of the cut-off parameter . In


principle, one is tempted to take as large as possible in order to mimic as closely
as possible the tail of the true Gaussian distribution. On the other hand, we must not
forget that we are substituting the Gaussian probability distribution function F (x) by
the piecewise linear approximation to F (x) computed in the points xi = F 1 (i/M).
In order to have the linear approximation as close as possible to the real Gaussian
distribution we also need M as large as possible. It is not efficient to choose M too
large because this would demand too much computer memory to store the table of the
x%i s. A reasonablevalue for M that we have been using is M = 214 = 16384 (although,
of course, larger values could be used if computer memory is not a problem). With that
particular value of M it turns out that x1 = F 1 (1/M) is equal to x1 = 3,668. If we
choose now, say, = 10, the linear approximation between x0 = = 10 and x1 is
obviously very bad. In order to allow for a smooth linear approximation we have chosen
x0 = = F 1 ( M1+2 ) which is sufficiently close to x1 to let the linear function be a
reasonable approximation to the true Gaussian distribution (for M = 16384, x0 = =
3,842). Greater values of can be obtained by increasing M: = 4,170, 4,475, 4,763,
for M = 216 , 218 , 220 respectively (see table 1).
The distribution function F (x) is given by:

4.1 Generaci
on de n
umeros aleatorios no uniformes

x F 1 ( M1+2 ) = xM

= 0
F (x) =
=

M +2
F (x)
M

71

1
M

xM x xM
x xM

(4.6)

Using this choice it is easy to verify that the values of xi are given by:
i+1
), i = 0, ...., M
xi = F 1 (i/M) = F 1 (
M +2
Due to the symmetry of the Gaussian distribution is obvious that:

(4.7)

xM i = xi

(4.8)

*x+ = 0

(4.9)

It is clear also that if x is a random variable distributed according to f(x), then its
mean value is zero:

The variance of x is given by:


2
M

= *x + =

y 2 f(y)dy

(4.10)

Integration by parts yields:


*
2 2
M
+
2
2
e 2
M
=1
(4.11)
M

This is to be compared with the value 1 for the real Gaussian distribution. When,
2
for instance, M = 16384, then M
= 0,99814.... Although this value is already very
close to 1 it might be desirable to have a distribution with an exact variance of 1 (see
the discussion in section 4). This is easily achieved by defining a new random variable
x = xM . This variable x is our final proposal for a pseudo-Gaussianrandom variable. Its
probability density function f(
x) is explicitly given by:
f(
x) = M f(M x)
4.1.9.a.

(4.12)

Programming Details

For the explicit implementation of the method detailed above one needs to find in
] belongs the U(0, 1) number . Since, in the most popular U(0, 1)
which interval [ Mi , i+1
M
generators, is obtained by a ratio of two integer numbers IR/L0 , where IR is a series
of NBIT random bits and L0 = 2N BIT , it turns out that the interval index i can be
found simply by the integer operation i = [ LM0 IR]. If we choose now M to be also a
IR
IR
power of 2, M = 2N P , then one needs to compute i = [ 2NBIT
NP ] [ 2NP 1 ]. Instead of
this division one could simply shift right NP 1 times the bit representation of the integer

72

Generaci
on de n
umeros aleatorios no uniformes.

number IR. Although it is not Fortran 77 standard, the shift operation is implemented
in many compilers (in the Cray compiler it is called SHIF T R(IR, NP 1) ) and it is
usually faster to perform than an integer division. The difference (M i) that appears
(2NP 1 )
. The modulus operation can be done as the
in equation (4.1) is equal to IR mod
NP
1
2
bit logical AND operation, namely:
I2 IR mod (2N P 1 ) = IR.AND.(2N P 1 1)

(4.13)

Again, the bit logical AND operation is standard in many compilers (the above expression is given in the CRAY compiler format).
The linear interpolation formula 4.1 translates into:
2N P 1 I2
xi
(4.14)
2
2N P 1
xi
If we now introduce the vector gi = 2NP
1 M , the final formula producing the random

numbers x distributed according to f (x) is:


x=

I2

x +
N P 1 i+1

x = I2gi+1 + (2N P 1 I2)gi

(4.15)

The algorithm described above has been implemented for the CRAY family of computers and a computer listing can be found in the appendix. The program is organized
as two subroutines: INIG250(ISEED,IX,N) and G250(IX,U,N). A call to the subroutine
G250(IX,U,N) will fill each element of the real vector U(N) with a Gaussian distributed random number. The subroutine INIG250 needs to be called once to initialize the
algorithm with a suitable value for the random number generator seed ISEED. In this
program we are using the R250 version of a shift register random number generator [?]
to compute the integer random numbers required by the algorithm. This generator uses
the recursion formula:
IXi = IXip .XOR.IXiq

(4.16)

with p = 250, q = 103. IX is an integer vector (of which only the last 32 bits are used)
of dimension N+p. This has to be initialized with p initial values for the vector IX. This
is achieved by using the machine built-in random number generator (called RANF() on
the CRAY) which is, in turn, initialized by the call to RANSET(ISEED).
The calculation of the numbers xi = F 1 ( Mi+1
) is done by the use of the following
+2
approximation formula to the inverse function x = F 1 () [17]:
x=t

c0 + c1 t + c2 t2
+'
1 + d1 t + d2 t2 + d3 t3

(4.17)

where
t=

"

2 log(1 )

(4.18)

c0 , c1 , c2 , d1 , d2 , d3 are parameters. This approximation has an error ' less than


4,5 104 for the range 0,5 1,0. The values for 0 0,5 are found by using
the symmetry relation equation (4.8).

4.1 Generaci
on de n
umeros aleatorios no uniformes

73

It is not only necessary that the program is fast, but it also has to deliver good quality
random numbers. To show the effect of the tail cutoff we have computed analitically
the values of the 4th and 6th moments of the distribution given by equation (4.12) as a
function of the cutoff value (remember that the second order moment is exactly 1 by
construction). These values are shown in table 1. We can see from this table that for a
table size of, e.g., M = 214 there is a relative error of 7,524 105 and 3,35 104 in
the fourth and sixth order moments respectively.
In order to test the algorithm and to see the effect of the piece-wise linear approximation, we have generated 108 Gaussian random numbers by using the NI method. The
lower order moments obtained were *x+ = 1,228 106 , *x2 + = 0,9999923, *x3 + =
6,20 105 , *x4 + = 2,979, *x5 + = 6,53 104 , *x6 + = 14,56 in good agreement with
the analytical results of table 1. In figure (??) we show a plot of the probability density
function obtained numerically after generating 108 random numbers by the NI method
compared with the exact Gaussian distribution. The main objective of this figure is to
show that the discrepancies are too small to be seen in this scale. Figure (??) is a logarithmic plot of figure (??) to show the small discrepancies in the tail of the distribution.
These results show that linear approximation is sufficient for the table sizes used here.
Of course, one could reduce the value of the table size required by using higher order
interpolation. However, we believe that since a table size of 16384 real elements can not
cause any memory problems in modern computers, there is no real need to use the more
complex algorithms that involve higher order interpolation.
Whether the NI method as implemented here would be suitable to a particular problem will depend on how much the tail of the Gaussian distribution can affect the results.
Consider, for example, the problem of solving numerically a stochastic differential equation with a Gaussian random noise source [?]. The numerical algorithms use Gaussian
random numbers of mean zero and variance 1. It has been suggested that, in order to
speed up the algorithm, some of these Gaussian random numbers can be replaced by
non-Gaussian random numbers with the same first lower moments, without modifying
the order of convergence of the algorithm [?]. In particular, the random variable defined
by the probability density function:

1
1
2
f (x) = (x + 3) + (x) + (x 3)
(4.19)
6
3
6
((x) is the Dirac delta function) has the four lower moments, *x+, *x2 +, *x3 +, *x4 +,
equal to those of the Gaussian distribution. However, the fact that this distribution is
clearly very different from a Gaussian distribution could introduce some unwanted bias in
the errors. We believe that it is better to maintain the shape of the distribution function
as close to that of a Gaussian as possible and, what it is more important, it does not
take longer with the NI method to generate a pseudo-Gaussian random number than it
would take to generate a random number with the distribution of equation (4.19). In
other problems, however, (like in the case of mean first passage time problems [?]) the
tails of the distribution can be important and the NI method may not be suitable since
it cuts-off the tail. The cut-off value could be, of course, increased by increasing the
value of the parameter M. We would like to stress that even the Box-Muller-Wiener
algorithm, when implemented on a computer, gives a cut-off distribution because the

74

Generaci
on de n
umeros aleatorios no uniformes.

"
maximum number one can obtain in a, say, 32 bits machine is 2 log(231 ) = 6,55.
On the other hand, one may also ask whether it is physically meaningful that the results
of a particular problem depends so heavily on the tails of the Gaussian distribution, or
whether the physical process is still well described by a Gaussian distribution even for
events lying 3.842 times the standard deviation of the mean.
4.1.9.b.

Appendix: Program listing

C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C

G250
Gaussian random number generator
Fills vector U(N) with cut-off Gaussian distributed random numbers
by using a numerical inversion method.
The cut-off value depends on the parameter NP.
To use first initialize it by calling
CALL INIG250(ISEED,IX,N)
where in the main program one needs to put
DIMENSION IX(N+250)
DIMENSION U(N)
Then subsequent calls:
CALL G250(IX,U,N)
will fill up U with cut-off Gaussian random numbers.
subroutine inig250(iseed,ix,n)
parameter
parameter
parameter
parameter
parameter
dimension
dimension

(np=14)
(m=2**np)
(ip=250,iq=250-103)
(nbit=32)
(np1=nbit-np)
ix(n+ip)
g(0:m)

common /c250/ g
common /d250/ nn,nn1
data c0,c1,c2/2.515517,0.802853,0.010328/
data d1,d2,d3/1.432788,0.189269,0.001308/

4.1 Generaci
on de n
umeros aleatorios no uniformes

200

75

maxint=2**nbit-1
call ranset(iseed)
do 200 i=1,ip
ix(i)=ranf()*maxint
continue
nn1=2**np1
nn=nn1-1

856

pi=4.0d0*datan(1.0d0)
do 1 i=m/2,m
p=real(i+1)/(m+2)
t=sqrt(-2.0*log(1.-p))
x=t-(c0+t*(c1+c2*t))/(1.0+t*(d1+t*(d2+t*d3)))
g(i)=x
g(m-i)=-x
continue
write(6,*) Cut-off value= , g(m)
u2th=1.0-real(m+2)/m*sqrt(2.0/pi)*g(m)*exp(-g(m)*g(m)/2)
u2th=nn1*sqrt(u2th)
do 856 i=0,m
g(i)=g(i)/u2th
return
end
subroutine
parameter
parameter
parameter
parameter
parameter

g250(ix,u,n)

(np=14)
(m=2**np)
(ip=250,iq=250-103)
(nbit=32)
(np1=nbit-np)

dimension ix(n+ip)
dimension u(n)
dimension g(0:m)
common /c250/ g
common /d250/ nn,nn1
do 150 k=1,n

76

Generaci
on de n
umeros aleatorios no uniformes.

150

ir=ix(k+iq).xor.ix(k)
i=shiftr(ir,np1)
i2=ir.and.nn
u(k)=i2*g(i+1)+(nn1-i2)*g(i)
ix(k+ip)=ir
continue

250

do 250 i=1,ip
ix(i)=ix(i+n)
continue
return
end

4.1 Generaci
on de n
umeros aleatorios no uniformes

77

Ejercicios
1. - Comprobar que la transformacion x = log(u) genera un numero aleatorio de
f.d.p. fx (x) = exp(x) si u esta uniformemente distribuido en el intervalo (0, 1).
Para ello, generar N = 100, 000 numeros aleatorios y construir una aproximacion a
fx (x) mediante un histograma de anchura x = 0,01 y ajustar la funcion exp(x)
al histograma. Como dependen el resultado del numero de puntos N y la anchura
de las barras del histograma x?
2. - Repetir el problema anterior para numeros aleatorios de distribucion gaussiana
de media 0 y varianza 1 usando numeros generados mediante el algoritmo de
Box-Muller-Wiener.
3. - Repetir el problema anterior para numeros aleatorios de distribucion gaussiana
de media cero y varianza 1 usando generados mediante el algoritmo que utiliza la
aproximacion a la funcion error inversa explicado en el texto. Comparar la diferencia
de tiempos de ambos algoritmos.
4. - Repetir el problema anterior usando el metodo que suma 12 variables U (0, 1)
para generar un numero gaussiano.
5. - Utilizar el metodo de inversion numerica para generar numeros aleatorios distribuidos segun la f.d.p. fx (x) = 34 (1 x2 ) para x (1, 1). Comprobar que los
numeros generados satisfacen dicha distribucion comparando la distribucion exacta
con el histograma obtenido numericamente.
6. - Para que valores de n es mas eficiente generar valores segun fx (x) = xn usando
la relacion x = max(u1 , . . . , un ) o usando x = u1/n ?
2

7. - Utilizar el metodo de rechazo para muestrear fx (x) = Cex en el intervalo


(0, 1) y aprovechar el resultado para calcular la integral del ejercicio 2.10 con el
metodo de muestreo.
8. - Sean x1 , . . . , x6 numeros aleatorios gaussianos de media cero y correlaciones
dadas por: Cij = 21 i1,j + i,j + 12 i+1,j (se suponen condiciones de contorno
periodicas en estas funciones ). Generar numeros aleatorios con dicha distribucion
y utilizarlos para calcular por el metodo de muestreo importante el valor esperado
*x1 x2 x3 x4 x5 x6 +, comparar con el resultado exacto dado por el teorema de Wick.
9. - Demostrar mediante representacion grafica de los puntos resultantes que los
puntos (x, y) donde x = r cos(), y = r sin() donde r es una v.a. distribuida
uniformemente en el intervalo (0, 1) y esta distribuida uniformemente en el
intervalo (0, 2), no estan distribuidos uniformemente en el crculo de centro 0 y
radio 1. Disenar un algoritmo basado en los metodos de rechazo que s produzca
numeros uniformemente distribuidos en dicho crculo.

78

Generaci
on de n
umeros aleatorios no uniformes.

10. - Disenar un algoritmo de rechazo que genere un vector uniformemente distribuido en la superficie de una esfera unidad n-dimensional. Calcular la eficiencia del
algoritmo como funcion de n
11. - Generar valores de la v.a. distribuida segun la funcion densidad de probabilidad:
fx (x) =

x1 ex
,
()

0 < < 1, x 0

12. - Utilizar un metodo de rechazo para generar variables aleatorias distribuidas con
la f.d.p. fx (x) = C exp( 21 x2 x4 ). Calcular (numericamente a partir de la
probabilidad de aceptacion) la constante de normalizacion C.
13. - Repetir el problema anterior con la f.d.p. fx (x) = C exp( 21 x2 x4 ).
14. - Utilizar el metodo de inversion de la funcion de distribucion para generar numeros
aleatorios discretos distribuidos segun una distribucion de Poisson de parametro .
Calcular en funcion de el tiempo necesario para generar 105 numeros aleatorios
(tomar =0.5, 1.0, 2.0, 5.0, 10.0).
15. - Repetir el problema anterior usando el metodo de rechazo con una f.d.p. geometrica conveniente.
16. Generar la distribucion binomial usando (i) la inversion de la funcion de distribucion, (ii) un metodo de rechazo.
17. - Utilizar el metodo de inversion de la funcion de distribucion para generar valores
de la variable aleatoria bidimensional:
&
6x si x + y 1, x 0, y 0
fxy (x, y) =
0 en caso contrario
18. - Repetir el problema anterior usando un metodo de rechazo.
19. - Para el metodo de rechazo en el que el nuevo valor es igual al antiguo si se rechaza
*
xn x
0 + *
xn +*
x0 +
en el
la propuesta, calcular la funcion de correlacion C(n) =
2
[
x0 ]
estado estacionario.
20. - Para dicho metodo calcular la funcion de correlacion no lineal:
C(n) =

*
xn + *
x +
*
x0 + *
x +

También podría gustarte