|
Números pseudoaleatorios: C++ Linux
Publicado el: 06-07-2007 @ 10:52 pm
Cuando tenemos la necesidad de simular algún fenómeno estocástico (basado en probabilidades) posiblemente habrá que recurrir a los números pseudoaleatorios. Estos números son generados por rutinas que intentan reproducir la propiedad estadística de que cualquiera de ellos tiene misma probabilidad de ocurrencia. Lo de pseudoaleatorio proviene del hecho de que la serie siempre será igual cuando se utiliza el mismo número generador ó semilla (seed en inglés). No obstante, uno de los principales obstáculos que se les presenta a los programadores es que las rutinas deben producir una serie lo suficientemente larga para los propósitos que se requieran, es decir, que no sean cíclicos. Estos números pseudoaleatorios, al igual que las probabilidades, están comprendidos entre 0 y 1. Sin embargo, para algunos propósitos especiales podemos requerir que ellos presenten, adicionalmente, la propiedad de tener media 0 (cero) y varianza 1. Supongamos que queremos generar una secuencia de lluvia. Primero, debemos escoger un modelo estadístico para ello. Estos módelos estadísticos se basan en cadenas de Markov donde la probabilidad de ocurrencia de la precipitación depende de si los días anteriores fueron lluviosos ó no. Sin entrar en las dificultades propias de como encontrarlas diremos, por ahora, que las probabilidades de día húmedo (lluvioso) corresponden a un número entre 0 y 1 y sus valores serán más elevados mientras más lluvioso sea el mes del año al cual hagamos referencia. Por tanto, los meses secos tendrán probabilidades de día húmedo muy bajas y el sentido común nos señala que la mayoría de los números pseudoaleatorios generados en estos casos serán mayores. En consecuencia, las rutinas para generar las secuencias deben comparar el número pseudoaleatorio producido con la probabilidad mensual de día húmedo y si es mayor que ésta entonces el día será seco (se le asigna un cero). En caso contrario el día será húmedo (se le asigna un 1). Por otra parte, una vez que tenemos que un día es húmedo (unos en la secuencia), se requiere de un modelo estadístico-matemático que nos permita asignarle la magnitud de la cantidad llovida para ese día. Las distribuciones mensuales de lluvia siguen patrones asimétricos (no son distribuciones normales ó gaussianas) que son caracterizados por parámetros estadísticos que, por ahora, tampoco nos interesa mencionar ni decir como se determinan pero lo que si es importante es que se requieren los números pseudoaleatorios que presentan las propiedades anteriormente referidas: media cero y varianza uno. A continuación, en este link: http://blogel.espaciolinux.info/wp-content/archivos/zeka/ALEATORIO.zip incluyo un pequeño programa escrito en C++ (*.zip) cuya rutina para generar los números pseudoaleatorios anteriormente mencionados (aleatorios.h), la he utilizado en programas para obtener series sintéticas de precipitación. Después de desempaquetado el programa, nos movemos hacia la carpeta ALEATORIO y allí compilamos con: g++ aleatorio.c++ -o aleatorio La ejecución del mismo con ./aleatorio produce una serie pareada (65.000 x 2 = 130.000) de números pseudoaleatorios en salida.out (semilla -2.000.000) cuyas propiedades estadísticas pueden ser verificadas en una hoja de cálculo de Openoffice ó en Excel. La primera serie (primera columna) tiene media 0,5 y la segunda serie (segunda columna) media 0 y varianza 1; tal como se deseaba. Aunque en este caso no lo tomé en cuenta, siempre es conveniente que las semillas se almacenen en archivos externos a fin de que no tengamos que modificar el programa para obtener una nueva serie con otra semilla.

Ultima actualización el 04-01-2008 @ 08:28 am
|