Al observar una sucesión de números reales, dada por un generador aleatorio específico, ¿cómo decidir si este generador es adecuado? La única forma práctica de estimar una probabilidad es expresarla como un límite de frecuencias experimentales.
El vector
es la
-ésima
-tupla de elementos consecutivos de la sucesión. la
suma
es el número de
-tuplas de elementos consecutivos
de la sucesión que están en
, entre los
primeros.
Por tanto, la definición anterior dice que entre las -tuplas de
elementos consecutivos de elementos de la sucesión, la proporción
de los que caen en un rectángulo dado debe tender al volumen de
ese rectángulo (en dimensión
). Esta definición es pasablemente
utópica. En particular ella conlleva a que la probabilidad de que
Random caiga en un punto prefijado es nula. Sabiendo que
sólo hay una cantidad numerable de números racionales en
,
la probabilidad de caer sobre un número racional es de también
nula. Pero la computadora conoce solamente los números decimales,
y aún más un número finito de ellos, por tanto la función
Random
no puede dar como resultado otra cosa que números
racionales. Pero esto no es un inconveniente.
Si sabemos construir una sucesión
uniforme de dígitos entre 0 y
, podremos obtener números
reales al azar en
, aproximados hasta la
-ésima posición
decimal, considerando
-tuplas consecutivas de dígitos de la
sucesión original. Este es el principio de las ``tablas de números
aleatorios'' que todavía se encuentran en algunos libros. La misma
observación puede hacerse en base
. Es suficiente saber definir
que cosa es una
sucesión aleatoria de bits. Veamos a continuación
la definición de
-uniformidad para las sucesiones booleanas 0
o
).
Lo que esperamos de la sucesión de llamadas de Random, es
que la sucesión que se obtiene sea -uniforme, para todo entero
(decimos
-uniforme). Esto es evidentemente ilusorio,
porque el infinito no existe en un ordenador. Lo más que podemos
hacer es verificar que nada inverosímil se produce en la sucesión
finita observada. Precisamente este es el objetivo de los tests
estadísticos, separar lo plausible de lo que es poco verosímil.
Multitud de tests han sido pensados para probar a los generadores
aleatorios.
``Definición''
Una -tupla de números en
será llamada pseudo aleatoria
si pasa con éxito una serie de tests estadísticos, cada uno de
ellos con el objetivo de verificar una consecuencia de la
-uniformidad. El número de los tests, así como el entero
son una función creciente de la exigencia del
usuario.
Entre las diferentes formalizaciones del azar que pudieron haber
sido propuestas, la noción de sucesión -uniforme es la
única utilizable en la práctica: ella es la única que podemos
comprobar para un generador dado y ella basta para justificar
todas las aplicaciones de los generadores pseudo-aleatorios. Los
generadores que se suministran con los compiladores más usados
vienen de una larga experimentación estadística, y han sobrevivido
a lo largo del tiempo porque satisfacen las necesidades de
numerosos usuarios, lo que no impide que se mantengan bajo
vigilancia.
¿Cómo están programados? Aún las sucesiones
recurrentes más simples pueden ser caóticas y por tanto ser
ejemplos de sucesiones aparentemente aleatorias. Y esto, aún el
sentido intuitivo de aleatorio (imposible de prever), está en
contradicción con la definición de una sucesión por recurrencia
(cada término es una función conocida del anterior). Para un
ordenador sólo existe un número finito de valores. Los valores de
Random son calculados siempre a partir de enteros
distribuidos en
donde
es un número
grande (del orden de
al menos para los generadores
usuales). Para dar un número real en
, basta dividir por
. En la práctica sólo puede obtenerse un número finito de
valores, y esto con probabilidad positiva. Esto contradice los
postulados de la definición de Random, pero no constituye un
inconveniente importante en la medida en que
sea muy grande.
Para obtener otro tipo de valores, por ejemplo números enteros
distribuidos uniformemente en
o números booleanos
(cara o cruz), es inútil pasar por llamadas de Random, es
mejor partir directamente del generador sobre
sin dividir previamente por
. Esto se
tiene en cuenta en la mayoría de los lenguajes en uso.
El valor que nos da un generador es una función del valor
precedente o de varios valores obtenidos con anterioridad. En el
primer caso, la sucesión que se calcula es una sucesión
recurrente. Para comenzar el proceso se selecciona una
``semilla'', , en el conjunto
, los
valores de la sucesión se calculan a partir de una expresión
, donde
es una función de
en si mismo, suficientemente simple como para ser
calculada rápidamente.
Nos enfrentamos entonces a un problema importante: toda sucesión
recurrente sobre un conjunto finito es periódica. La
sucesión de valores que nos da Random hará, necesariamente,
un lazo. ¿Podemos considerar como aleatoria a una sucesión
periódica? Sí, puede ser, si el período es lo suficientemente
grande en relación con el número de términos que vamos a emplear.
La prudencia debe prevalecer en general, de todas formas hay que
evitar la idea intuitiva de que mientras más complicada sea la
forma de calcular a partir de
, más independientes
serán los valores entre síy el generador será mejor.
Los generadores aleatorios más simples son los
generadores por congruencias. Ellos son de la siguiente forma:
Resultados diversos en matemáticas, dicen cómo
seleccionar ``correctamente'' ,
y
. Ya prácticamente no
se usan, desde que aparecieron nuevos generadores mas eficientes.
El generador que damos a continuación estaba muy difundido y en
general era satisfactorio; todavía puede ser útil.
Todo generador necesita una inicialización. Para un mismo valor de
la semilla , se obtiene siempre la misma sucesión de valores
al emplear el generador. Para obtener resultados diferentes de una
sucesión a otra, es necesario cambiar la semilla al principio de
cada calculo. En dependencia del lenguaje que se utilice, esta
inicialización puede dejarse a la elección del usuario, o puede
ser realizada a partir del contador de tiempo del
ordenador(función randomize en Pascal, seed en
C...). La instrucción de tomar una semilla aleatoria debe
figurar una sola vez, al principio del programa principal.