Módulo aleat.h 1.3 para Inform
(C) 2000 El Presi (Enrique D. Bosch) [kifcu@confluencia.net]
Puede distribuirse libremente bajo licencia GNU LGPL


Esto es un módulo para Inform (no necesariamente para informatE, aunque
puede usarse conjuntamente) que proporciona números pseudoaleatorios
mediante el algoritmo del método de congruencia lineal, con aceso a su
semilla y los parámetros críticos del algoritmo. La semilla es lo que
determina la secuencia pseudoaleatoria que se va a generar, dadas semillas
diferentes se generarán secuencias de números diferentes y para una misma
semilla siempre se generará la misma secuencia de números, de ahi que no
sean realmente aleatorios sino solo pseudoaleatorios; por eso es
recomendable que la semilla inicial se distinta en cada ejecución, siempre
que no se quiera tener la misma y única secuencia.
Si se quisieran generar números realmente aleatorios se debería recurrir a
eventos externos del sistema o al uso de hardware especial, pero este módulo
no cubre eso.

El módulo puede compilar tanto para la máquina Z como para Glulx. La
versión 1.2 corrige un grave bug presente en la versión 1.1 y se puede
compilar tanto con Inform 6.21 (o superior) como con Inform 6.15.

La versión 1.3 corrige un bug que compilando para Glulx, bajo ciertas
condiciones se producía overflow y la función randosem devolvía negativos
cuando no debía. También cambia un parámetro (el módulo) bajo Glulx para
mejorar la aleatoriedad.

Nota: Si se presentan otros problemas de aleatoriedad, se deben cambiar los
valores del algoritmo con la función pcriticos.

Ya que este módulo se ejecuta sobre Inform, utiliza aritmética entera, no
implementa nada de números reales (coma flotante).

El módulo se implementa como la clase "generador", asi que en el código debe
declararse por lo menos una instancia (objeto) de esa clase, asi se pueden
definir distintos objetos generador con semillas y parámetros críticos
independientes.

Ejemplo de inclusión de alet.h junto con declaración de un objeto generador:

include "aleat";
generador aleatorio;


Interfaz del módulo (métodos proporcionados):


aletorio.randomsem(a,z)      Devuelve un número pseudoaleatorio comprendido 
                             entre a y z (a>=0, a<z, z<=32766).                             

aleatorio.csemilla(x)        Cambia la semilla al valor de x.

aleatorio.msemilla()         Devuelve la semilla actual.

aleatorio.pcriticos(u,s,m)   Permite cambiar los parámetros críticos del
                             algoritmo en tiempo de ejecución.
                             u=multiplicador, s=sumando, m=módulo. Por
                             defecto trae unos valores aceptables pero se
                             pueden cambiar en cualquier momento.


si se quisiera utilizar otra instacia de la clase, se declara:

generador otro_aleatorio;

y los métodos se nombrarán entonces asi:

otro_aleatorio.randomsem
otro_aleatorio.csemilla
etc.

Identificadores usados en aleat.h, para evitar colisiones con otros módulos
o con el programa principal:

class generador (con las propiedades publicas [métodos] comentadas antes
y las siguientes propiedades privadas):
semilla
mul
sum
mod
absmu
constant ALEAT_MODULO

Agradecimientos: principalmente a Zak que me dio la idea, a todos los de la
lista informatE y a todos los aventureros en general.
