Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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)
(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.
1 + x
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)
1 2
fr(r) dr = 1 e 2 r
(4.9)
(4.10)
(4.12)
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
(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
(4.1)
54
Generaci
on de n
umeros aleatorios no uniformes.
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)
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
z = 2erf 1 (2u 1)
(4.4)
c0 + c1 t + c2 t2
1 + d1 t + d2 t2 + d3 t3
(4.5)
donde
t=
"
2 log(1 u)
(4.6)
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)
x
1 =
r cos()
x
2 =
r sin()
(4.8)
(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)
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() =
(4.16)
(4.17)
z=
(4.18)
N k=1
2
58
Generaci
on de n
umeros aleatorios no uniformes.
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)
j
'
bji
zi + j
(4.25)
i=1
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
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)
(4.3)
z [0, 1]
(4.4)
(4.5)
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
0x1
(4.10)
(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
(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
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.
(4.2)
fx (x|
y = 1) = 4
(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)
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
(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
(4.10)
x2
x4 ) x (, )
2
(4.11)
(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.
(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.
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)
(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)
es decir:
6
h(x)gx (x) dx
h(x)gx (x)
h(x)gx (x) dx
fx (x) = 4
(4.22)
(4.23)
(4.24)
(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)
(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
(4.2)
i=0
m
'
i=0
pi u
(4.3)
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)
(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
'
i=0
pi (x xi ),
pi = e
i
i!
(4.9)
alternativamente:
m
'
i
i=0
i
u
i!
(4.10)
ue
(4.11)
i!
(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
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
|lambda i=0
i=0
o bien
m
9
i=0
ui e
>
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
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
4.1.9.
Ap
endice: Inversi
on num
erica para la distribuci
on gaussiana
F (x) =
f (x) = "
1
(2)
x2
2
1
x
f (y)dy = (1 + erf( ))
2
2
(4.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)
=
0
x
(4.5)
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:
= *x + =
y 2 f(y)dy
(4.10)
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
I2
x +
N P 1 i+1
(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)
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.
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
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 +