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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> |
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.
+2 en T3 de simulación
ResponderEliminar