viernes, agosto 10, 2007

Numeros al azar...

El azar es un tema apasionante que quizas no nos lleve a otro lugar mas que al de identificarlo de una manera mas clara. El azar no es manejado por ninguna ciencia y sin embargo existe toda una gran industria detras de la generacion de numeros al azar. El azar en mi manera de pensar, el metodo 100% libre de tendencias, libre de mecanismos matematicos, libre de algoritmos... es simplemente el desconocer por completo, que es lo que va a pasar a continuacion.

  • Las computadoras como generadores de numeros al azar.
Las matematicas son quizas, las que se ven mas de frente con el azar, sinembargo una ciencia tan exacta como las matematicas lo unico que puede lograr es generar numeros pseudoaleatorios, numeros que aparentan ser escogidos al azar.

Generalmente el metodo tiene una entrada llamada "semilla" con la cual el metodo genera una cantidad limite de numeros. Sinembargo, si se logra identificar el mecanismo y la semilla, los numeros se volverian predecibles. Algo que me imagino, no sería muy agradable saber cuando nuestro dinero está en juego.

Mediante la estadistica se puede probar metodos de generacion de numeros al azar, ya que con ésta es facil identificar tendencias e incluso hasta patrones. Si el algoritmo en cuestion no pasa estas pruebas de aletoriedad, generalmente se descarta. Se dice que un algoritmo se ha "roto" al poder identificar el mecanismo que usa para generar los numeros pseudoaleatorios.

En una prueba se planeaba generar 4 millones de numeros al azar usando 4 motores de numeros random en conjunto... al llegar al millon de numeros, los numeros se repetian por completo!!! dejamos corriendo el programa por casi media hora sin lograr al menos algun otro numero distinto.

En algunas motherboards se colocaba una microantena que captaba la señal de radio generada por los mismos chips de la computadora y en base a lo obtenido se generaban los numeros. En teoria, no hay ningun algoritmo que romper!

Un metodo muy bueno para generar numeros aleatorios es captando el ruido atmosferico. Si uno sintoniza un radio AM en la primer posicion posible, antes que cualquier señal humana sea perceptible, entonces entraras en el area del ruido blanco puro. Se dice que, es el mejor metodo para generar numeros aleatorios, ya que esta libre de cualquier mecanismo duplicable.

Ademas es barato y elegante, como lo comprobaron la gente de random.org Quienes literalmente conectaron una radio a la tarjeta de audio de la computadora, y en base al ruido empezaron a crear archivos cuyo contenido es 100% Aleatorio. Estos archivos son descargables desde su pagina. ;)

  • ¿Que hay de los dados y las cartas?
Luego de un dia entero de jugar a Serpientes y Escaleras, un amigo nos sorprendio con su tecnica especial para sacar seises en los dados... logró hacerlo unas 4 veces continuas!!!

Lamentablemente las perforaciones en los dados hacen que el centro de masa cambie, dandole preferencia a ciertos numeros mas que a otros. Es por esa razon que los dados "profesionales" tienen "burbujas" dentro que ayudan a contrarestar esto. Unos dados balanceados correctamente pueden ser buenos generadores de numeros al azar.

En unas pruebas se compraron dos dados baratos (.1dll) y se lanzaron 100 veces y en ambos se notaron tendencias hacia alguno de sus 6 numeros, pero las tendencias fueron tan pequeñas que se pueden llegar a aceptar en un juego "casero" de loteria (digamos que a 3 sobre o bajo la media).

Algunos metodos para generar contraseñas seguras como en The Diceware Passphrase Home Page se recomienda utilizar al menos 5 dados distintos para poder generar numeros "mas" al azar.

Ademas, se dice que en la Segunda Guerra Mundial, se contrataban muchachas exclusivamente para tirar varios "dados" y anotar el resultado. Estos resultados eran utilizados por los soldados para tomar decisiones verdaderamente al azar, ya que ni siquiera nuestro cerebro es buen generador de numeros.
  • El cerebro como generador de numeros aleatorios
Al platicar este tema con unos amigos, uno de ellos me pidio que le diera 4 numeros completamente al azar. Casi sin pensar anoté "seis dos.... treinta", y luego de hacerme muchas preguntas, me di cuenta que ese "6230" era el modelo de mi celular XD

Segun lo que nos quizo dar a explicar este señor, era que nuestro cerebro es casi incapaz de generar numeros al azar, siempre se basa en el pasado para generar algo "pseudoaleatorio". Es por esa razon que a los soldados no se les permitia tomar deciciens al azar... era relativamente facil descubrir que escogerian :(

Para este post, hice lo posible por pedirle a 10 personas 100 numeros del 1 al 100 escogidos al azar, sinembargo mi paciencia, menos la pacienta de los entrevistados, hizo que solo recibiera dos listados (uno de Xbaez y otro de Exarkin). Usando la tendencia progresiva se puede ver que mientras que uno oscila entre los 30 y 40s durante todo el trayecto, la otra persona oscila alrededor de algun numero que va cambiando en el trayecto.

Una misma prueba usando un programa (numeros cortesia de Requiem) tiene tendencias promedio entre 50 y 60, pero a diferencia, de los hechos por los humanos, los numeros no oscilan con respecto a ningun numero, son mas herraticos y menos... predecibles.

Interesante todo este rollo no? Espero que les haya gustado.

Hasta la proxima!

Kenrro.

6 comentarios:

Requiem dijo...

Geez, no sabia que random de python tuviera tendencias, estas seguro que no son una de esas secuencias frugales?
Puedez hace la prueba con esta secuencia?
[80, 23, 15, 74, 1, 26, 62, 34, 72, 56, 5, 81, 7, 17, 43, 38, 83, 49, 10, 30, 74, 91, 19, 96, 96, 11, 82, 79, 47, 9, 85, 56, 69, 42, 25, 16, 70, 72, 24, 29, 22, 20, 100, 16, 94, 85, 87, 61, 39, 38, 62, 21, 41, 1, 100, 3, 88, 98, 93, 51, 93, 97, 35, 78, 77, 40, 28, 57, 42, 97, 21, 10, 74, 6, 65, 87, 57, 42, 75, 72, 99, 86, 79, 57, 39, 79, 46, 97, 84, 62, 1, 49, 100, 40, 3, 67, 24, 68, 43, 8]

Kenrro dijo...

No sabia que eran de python, en si se puede ver que tiene preferencia con numeros mayores a 50.

Estos otros numeros parecen tener dos origenes, la primera mitad esta mejor distribuida pero con una tendencia que va desde los valores 40 a los 60, no toca ni se acerca a los limites.

La segunda mitad parese sacada de una formula de fourier :D, en si tiene una tendencia oscilante que va desde menos de 40 llegando a 65 y bajando nuevamente. Sobre esa tendencia los numeros oscilan casi siempre a la misma distancia (mas menos 20).

Los numeros de python tenian mas ruido.

Se puede saber de donde sacaste esos numeros?

Saludos mi estimado :)

Requiem dijo...

from random import randint as r
print [r(1,100) for x in xrange(100)]

Kenrro dijo...

jajajaja, que lenguaje es? Python? :D

Leyendo una pagina que trata del generador de numero random de Python, encontré esto:

It has a very high order of dimensional equidistribution (see linear congruential generator).
Note that this means, by default, that there is negligible[elaborate] serial correlation between successive values in the output sequence.

Basicamente, para aliviar este malestar habría que desordenar el listado, así ya no existiria esta corelacion entre numeros sucesivos :)

pero ah que weba... intenta con los archivos de random.org, luego posteo aqui una imagen pa que veas lo bonito que se generan esos numeros :)

Kenrro.

Requiem dijo...

Ok la tercera es la vencida, esta vez sin abreviaciones para ser mas claro
>>> import random
>>> prns = [random.randint(1,100) for x in xrange(100)]
>>> random.shuffle(prns)
>>> print prns
[29, 8, 91, 63, 48, 23, 42, 82, 87, 27, 32, 85, 98, 4, 39, 39, 55, 38, 69, 83, 63, 61, 36, 50, 77, 54, 76, 23, 34, 28, 95, 76, 51, 26, 47, 28, 50, 70, 85, 4, 36, 35, 47, 79, 14, 53, 44, 89, 48, 66, 64, 28, 63, 1, 79, 67, 39, 43, 35, 5, 27, 1, 47, 13, 66, 27, 77, 71, 36, 13, 58, 51, 20, 25, 91, 52, 75, 2, 79, 31, 89, 41, 96, 54, 19, 55, 100, 62, 91, 63, 26, 54, 96, 58, 29, 62, 3, 84, 41, 52]
La version es ruby es mas corta porque no tienes que importar random /* por otro lado todos tus programas cargan un generador de numeros aleatorios lo uses o no:( */
irb>
x = []
100.times{x.push ((rand * 100).floor)}
puts rand
#fin
nota este programa es equivalente al primer ejemplo que puse no al segundo

Kenrro dijo...

Ahora si, la distribucion se mantuvo pareja, con bastante ruido.

Quizas lo unico es que a partir del punto 57 la tendencia se dispara a menos 30 y por hay del punto 88 se dispara a mas 20, pero eso si los numeros estan mas "al azar" :)