Carlos A. García

Generación aleatoria de números

Autor: Carlos A. García. Archivado en Oracle
Etiquetas: · · · ·
01/sep/2009  

PL/SQL, como todo lenguaje de programción que se precie, cuenta con la funcionalidad necesaria para generar números aleatorios. Explicado de una forma rápida, resulta muy simple: llamamos sin parámetros a la función DBMS_RANDOM.value. El valor obtenido se encuentra entre 0 y 1, con lo que tendremos que operar con él si pretendemos generar números mayores (estoy pensando en la generación de un pin bancario, por ejemplo).

Una buena forma de convertir el número en un entero de cuatro cifras (por ejemplo), es coger los últimos cuatro dígitos del número aleatorio.
Es decir, algo como:

v := to_number(substr(to_char(dbms_random.VALUE), -4));

Bien, ya tenemos nuestro generador de números de cuatro cifras. Ahora la pregunta es ¿Cómo de aleatorios son los números obtenidos? Eso lo podemos saber, por ejemplo, generando una serie significativa de números y contando cuantas veces aparece cada uno. Está claro que el valor esperado será el cociente entre el número de números generados y el número de números posibles. Si, para cada valor, nos acercamos al valor esperado, esto significará que el método de obtención de valores es realmente aleatorio.

Ahora viene la sorpresa. Analizando los resultados, veremos que de esta forma no obtenemos ningún número acabado en cero. Es lógico, ya hemos dicho que los números están generados entre cero y uno. Está claro que si 0>x>1, el último dígito no será nunca un cero (y muy pocas veces si 0 >= x >= 1). Los ceros de la derecha de un decimal son eliminados. Ahora provaremos algo que debe funcionar: multiplicar el número aleatorio por 10.000 (queremos cuatro cifras) y coger la parte entera:

v := trunc(dbms_random.VALUE * 10000);

¿Funcionará? Si generamos 10.000 números, el valor esperado para cada valor será 1. Es fácil: 10.000 / 10.000. Debemos tener en cuenta que habrá números para los cuales no tendremos ninguna ocurrencia. Si no fuera así, no sería realmente aleatorio. La pregunta es ¿Qué porcentaje de números no debe aparecer para que consideremos el sistema como no válido? Os dejo la estadística para vosotros. Sólo daré un último dato: de 10.000 números generados, aproximadamente el 35% de los números no aparece. ¿Es bueno nuestro sistema?





Artículos relacionados



 Suscríbete a los comentarios de este post.  Comentarios

Dejar comentario

  1. makj dice:
    03 de septiembre de 2009 a las 8:41

    en realidad cualquier funcion que uses en base al generador de numeros aleatorios sera tan buena (o tan mala) como el propio generador
    ¿son realmente aleatorios los valores devueltos por esa funcion?

  2. Carlos A. García dice:
    04 de septiembre de 2009 a las 10:00

    Ahí está la duda. Debería hacer alguno de los tests estadísticos con los que tanto disfrutamos en la carrera para poder comprobar si la generación es realmente aleatoria. De una forma intuitiva, yo lo veo así: es tirar un dado seis veces y que siempre haya dos caras (un 33% de posibilidades del dado) que no aparezcan. Si este patrón se repite (sean cuales sean, no aparecen) yo tengo mis dudas al respecto. Quiero investigar un poco el tema …


Deja tu comentario








* Campos obligatorios  




2 comentarios »