lunes, 16 de abril de 2012

Características deseables de números aleatorios

Reforzando un poco mi entrada pasada en la que me falto probar más rigurosamente si los numeros generados con la función random.expovariate(lambd) nos da numeros con características aleatorias deseables.
Para esto se hacen algunas pruebas ya preestablecidas que detecta si el generador de números aleatorios esta generando secuencias de números predecibles.

Elegí el test de frecuencia monobit: Esta prueba detecta si hay muchos ceros o unos.

Código:

#!/usr/bin/python
import sys, random, math
import time
from scipy import stats
def monobit(lista):
sn = 0
for i in range(len(lista)):
if lista[i] == 1:
sn = sn + 1
else:
sn = sn - 1
sobs = math.fabs(sn)/math.sqrt(len(lista))
p_value = math.erfc(sobs/math.sqrt(2))
if(p_value > 0.01):
print 'Teste de frecuencia Monobit pasado ' + str(p_value)
else:
print 'Test de frecuencia Monobit no pasado ' + str(p_value)
#esta funcion convierte a ceros o unos los numeros generados
def cerosYunos(lista):
cerUnos = []
for i in range(len(lista)):
divisible = lista[i] % 2
if divisible == 0:
cerUnos.append(1)
else:
cerUnos.append(0)
return cerUnos
def main():
print "Probando si random.expovariate tiene caracteristicas de num aleatoios"
lista = []
numeros = 1000000
#lleno una lista con la funcion expovariate
for i in range(numeros):
res = random.expovariate(2)
#se multiplica el res por un numero para que sean numeros mas grandes
#y se usa ceil para convertirlos a enteros
lista.append(math.ceil(res*1000000000000))
lista = cerosYunos(lista)
monobit(lista)
main()
main()
main()
main()
view raw gistfile1.py hosted with ❤ by GitHub

Resultado:


Con lo que podemos concluir que expovariate de la librería random si genera números con características aleatorios deseables.

De esta manera completo los test de aleatoriedad que me faltaron la entrada pasada.


Aleatorios en JavaScript

Me interesó hacer una prueba Visual para números aletorios generados en JavaScript, con su función Math.random(), y esto es lo que obtuve generando cerca de 100000 de números:


Código:
<html>
<head>
<script type="application/javascript">
function draw(){
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var imageObj = new Image();
imageObj.src = "negro.jpg";
for (i=0; i<=500; i++){
for(j = 0; j<=500; j++){
var num = Math.random();
if(num > 0.5){
ctx.drawImage(imageObj, i, j);
}
}}
}
</script>
</head>
<body onload="draw()">
<canvas id="canvas" width="3000" height="3000"></canvas>
</body>
</html>
view raw gistfile1.js hosted with ❤ by GitHub


Esta prueba nos ayuda a ver de una manera simple si se esta siguiendo algún patrón en los números aleatorios, como no identificamos alguno podemos decir que es un buen generador de números aleatorios.

1 comentario: