Marcos García González (h[e]rtz)
Date: Verano 2004
Documento facilitado por la realización de la asignatura Métodos informáticos de la física de segundo curso en la universidad autónoma de Barcelona en el transcurso del año 2003-2004.
Un problema básico que nos encontramos habitualmente es el de obtener secuencias de números uniformemente distribuidos en un intervalo ![$ [0,1]$](img1.png) .
.
La diferentes posibilidades para resolver dicho problema son:
i) Buscar en tablas de números aleatorios publicadas (libros, internet ...);
ii) Observar un proceso físico tal como la desintegración radiactiva, el ruido eléctrico ...;
iii) Los lenguajes de programación y las hojas electrónicas incluyen una función para generarlos
iv) Mediante algorismos de generación de números aleatorios
Las principales ventajas de los generadores de números aleatorios son:
- Rapidez
- Comodidad
- Reproducibilidad
- Portabilidad
Y la desventaja fundamental:
- Las secuencias obtenidas no son realmente aleatorias, ya que se obtienen con operaciones deterministas. Solo podemos obtener secuencias pseudo-aleatorias, que a su vez satisfacen algunos criterios de aleatoriedad adecuados.
Los números generados deben cumplir ciertas características para que sean válidos. Dichas características son:
1. Uniformemente distribuidos.
2. Estadísticamente independientes.
3. Su media debe ser estadísticamente igual a 1/2.
4. Su varianza debe ser estadísticamente igual a 1/12.
5. Su periodo o ciclo de vida debe ser largo.
6. Deben ser generados a través de un método rápido.
7. Generados a través de un método que no requiera mucha capacidad de almacenamiento de la computadora.
Normalmente se utilizan números enteros, ya que su aritmética es exacta y rápida. Se generan enteros  entre 0
 y
 entre 0
 y  , y
, y 
 da valores reales en el intervarlo
 da valores reales en el intervarlo  .
.
En general los algoritmos utilizan relaciones de recurrencia del tipo
 
en el caso de recurrencia simple, o bien
 
para el caso de una recurrencia de orden
 .
.
 valores para recurrencias de orden
 valores para recurrencias de orden  ).
).
 
donde
 es el multiplicador y
 es el multiplicador y  el módulo.
 el módulo.
 valores posibles de
 valores posibles de  , entre 0 i
, entre 0 i  .
.
 ,
,  y
 y  , así como del valor inicial; nótese que el máximo posible es
, así como del valor inicial; nótese que el máximo posible es  .
.
 y la posible presencia de correlaciones entre términos consecutivos de la secuencia. Una manera sencilla de suprimir éstas limitaciones es
 y la posible presencia de correlaciones entre términos consecutivos de la secuencia. Una manera sencilla de suprimir éstas limitaciones es  desordenar
desordenar un poco la secuencia mediante el siguiente procedimiento:
 un poco la secuencia mediante el siguiente procedimiento:
 , y en primer lugar se genera con el GCL un vector que contiene una lista de
, y en primer lugar se genera con el GCL un vector que contiene una lista de  enteros aleatorios
 enteros aleatorios  , así como un entero aleatorio
, así como un entero aleatorio  . Se determina el índice
. Se determina el índice 
![$ k = [y * N/m]$](img19.png) , entre 0
 y
, entre 0
 y  .
.
 de la lista se da como un nuevo nombre aleatorio, y se reasigna a la variable
 de la lista se da como un nuevo nombre aleatorio, y se reasigna a la variable  el valor
 el valor  . El valor de
. El valor de  se renueva con el GCL, y se vuelve a repetir los pasos desde la determinación del índice
 se renueva con el GCL, y se vuelve a repetir los pasos desde la determinación del índice  .
.
 , se obtiene manipulando los bits del número anterior,
, se obtiene manipulando los bits del número anterior,  . En lenguaje C, esto se puede hacer facilmente utilizando operadores sobre bits,
. En lenguaje C, esto se puede hacer facilmente utilizando operadores sobre bits, 
 .
.
 
donde
 son enteros dados y
 son enteros dados y  denota alguna de las operaciones
 denota alguna de las operaciones 
 .
Este tipo de generador precisa iniciar (con otro generador) y mantener una lista de los últimos
.
Este tipo de generador precisa iniciar (con otro generador) y mantener una lista de los últimos  números generados.
 números generados.
![$ [0,1]$](img1.png) . Se puede realizar un test
. Se puede realizar un test  . Alternativamente, podemos estimar los momentos de orden
. Alternativamente, podemos estimar los momentos de orden 
 y comprobar que se aproximan a sus correspondientes valores teoricos,
 y comprobar que se aproximan a sus correspondientes valores teoricos,  .
.
 , y se comprueba si se distribuyen uniformemente en el cuadrado
, y se comprueba si se distribuyen uniformemente en el cuadrado 
![$ [0,1]\times [0,1]$](img33.png) .
.
 lugares en la secuencia,
 lugares en la secuencia, 
 . Su valor tendría que acercarse a 1/4.
. Su valor tendría que acercarse a 1/4.
 i
 i  se obtienen secuencias de periodo máximo
 se obtienen secuencias de periodo máximo  . Por ejemplo, si
. Por ejemplo, si  es una potencia de 2, bastará con que
 es una potencia de 2, bastará con que  sea impar y
 sea impar y  sea igual a un múltiple de 4 mas 1.
 sea igual a un múltiple de 4 mas 1.
 valores consecutivos,
 valores consecutivos,
 
estos forman hiperplanos paralelos en el espacio k-dimensional. La separación
 entre los planos tiene que ser la mínima posible.
 entre los planos tiene que ser la mínima posible.
 , definida en el intervalo
, definida en el intervalo 
 a partir de una secuencia de números con distribución uniforme
 a partir de una secuencia de números con distribución uniforme  .
.
 para obtener la distribución deseada. Si la densidad de probabilidad de
 para obtener la distribución deseada. Si la densidad de probabilidad de  es
 es  , tenemos:
, tenemos:
 
 
Si
 la integración de esta ecuación resulta ser
 la integración de esta ecuación resulta ser
 
Si sabemos calcular la integral, obtenemos una relación del tipo
 , que se tiene que invertir para poder obtener
, que se tiene que invertir para poder obtener 
 
 con distribución
 con distribución
|  | (1) | 
 
por lo tanto, el cambio adecuado será
 
 , nos queda la siguiente ecuación
, nos queda la siguiente ecuación
 
La integral no se puede resolver analíticamente, y menos aun invertir la relación para obtener
 .
La alternativa es aplicar el algoritmo de Box-Muller. Que permite obtener 2 valores independientes
.
La alternativa es aplicar el algoritmo de Box-Muller. Que permite obtener 2 valores independientes  ,
,  con distribución
 con distribución  si
 si  son las coordenadas de un punto del plano, la densidad de probabilidad de sus coordenadas polares es
 son las coordenadas de un punto del plano, la densidad de probabilidad de sus coordenadas polares es
![$\displaystyle w(r,\theta) = p(x_1, x_2) \left\vert \frac{\partial (x_1,x_2)}{\p...
...rt = \frac{1}{2\pi} r e^{-r^2/2}, \ \ \theta \in [0,2\pi],\ \ r\in [0, +\infty)$](img61.png) 
Por lo tanto,
 i
 i  tiene la densidad de probabilidad
 tiene la densidad de probabilidad 
 . Se pueden obtener a partir de 2 números
. Se pueden obtener a partir de 2 números 
 con las transformaciones
 con las transformaciones 
 . Por lo tanto
. Por lo tanto  se pueden obtener con las transformaciones
 se pueden obtener con las transformaciones
|  | (2) | 
 definida en un intervalo finito,
 definida en un intervalo finito,  , y
, y  una cota superior de
 una cota superior de  . Se generan dos valores aleatorios
. Se generan dos valores aleatorios 
 y
 y 
 Entonces:
 Entonces:
|  | (3) | 
 aparece con una densidad de probabilidad
 aparece con una densidad de probabilidad  , aunque no se aprovechan todos los valores que obtenemos en la realización del método. De todos modos, este es el único método disponible cuando la distribución de probabilidades es complicada. De hecho es la base del algoritmo de Metropolis, posiblemente el más utilizado en física computacional.
, aunque no se aprovechan todos los valores que obtenemos en la realización del método. De todos modos, este es el único método disponible cuando la distribución de probabilidades es complicada. De hecho es la base del algoritmo de Metropolis, posiblemente el más utilizado en física computacional.
DoFinal(); ?>