Monday, February 13, 2006

Numero Aleatorios

Numeros Aleatorios

Cuando una persona en un programa pide un numero aleatorio, de verdad esta pidiendo un numero arbitrario. Por su definición matemática, actualmente no existen números aleatorios. Un número aleatorio definido matemáticamente es que todos los números tienen la misma probabilidad de salir, para esto ser cierto, el número no puede estar en un rango finito. La definición va aun mas allá de las probabilidades que salga un número sea igual a todos los otros números. Se supone que si pedimos un número aleatorio, se pudiéramos echar el tiempo para atrás y dejar que pidamos el número una vez mas, el número pudriera y debería de ser diferente.

Método Lineal Congruencial:
For i = 2 to N
A[i] = (a[i-1]*b +1) mod m

Este método es muy utilizado, es fácil de implementar y siempre da un número por debajo de m-1. Es una ventaja muy grande para los programadores, podemos limitar el rango del número arbitrario que vamos a tener. Tan simple como se ve, esta es la ecuación para generar números arbitrarios mas estudiada. Cuando uno no desea una secuencia aleatoria sino un número arbitrario, se utiliza a como una variable global y no un arreglo. Se dice que funciona mejer bajo estas circunstancias:
1. m es un número grande, una potencia de 10 o de 2
2. n no es muy grande ni muy pequeño, un digito menos que m
3. El tercer digito de b es par, y termina en 21.

El problema más grande de los generadores de secuencias aleatorias, el algoritmo se agota eventualmente y comienza a repetir la secuencia. Esto se debe a las leyes de las matemáticas, un proceso matemático siempre va a repetir resaltados.

#include
#include

using namespace std;


const static int m = 100000000;
const static int m1 = 10000;
const static int b = 31415821;
int a;
int Mult(int p, int q)
{
int p1,p0,q1,q0;
p1 = p / m1; p0 = p % m1;
q1 = q / m1; q0 = q % m1;
return (((p0*q1+p1*q0) % m1)*m1+p0*q0) % m;
}

int random(int r)
{
a = (Mult(a,b) +1) % m;
return ((a / m1) * r) / m1;
}

int main(int argc, char *argv[])
{

int i,N,r;
cout<<"Cantidad de numeros?\n";
cin >> N;
cout<<"Seed\n";
cin >> a;
cout<<"Rango\n";
cin >> r;
for(i = 0;i cout< system("PAUSE");
return 0;
}

Preguntas:
1. ¿Como simularías el tiro de dos dados, si ambos dados son irregulares y tienen los números 1, 2, 3, 5, 8 y 13?
2. Escriba un programa para producir imágenes de dos dimensiones aleatorios
3. Escriba un programa para que imprima 4 letras aleatorias
4. ¿Que formas tenemos para automatizar la lectura del “seed” (que es la base de la secuencia aleatoria)?
5. ¿Seria buena idea utilizar b = 3 en este algoritmo? ¿Por qué?

No comments: