Desarrollando en Cobol y Natural sobre Plataforma Mainframe

martes, 3 de diciembre de 2013

Simulación del lanzamiento de un Dado en Cobol

Desde siempre sabemos que Cobol no es un lenguaje muy preparado para trabajar con generación de números aleatorios. De hecho, en la mayoría de las aplicaciones en las que se usa Cobol dicha necesidad no existe (ya que se trata de aplicaciones de gestión pura). Sin embargo, si alguna vez necesitamos números aleatorios, existe una forma de generalos.

 

Para obtener números pseudo-aleatorios tendremos que recurrir a la función RANDOM. Dicha función procede a generar un número aleatorio a partir de un número Semilla dado. Por tanto, obtener un aleatorio será tan simple como invocar a la función RANDOM con un número predefinido.

FUNCTION RANDOM(SEMILLA)

¿Cuál es el problema de la función RANDOM? Bueno, pues tal y como se indica en su definición, lo que hace es generar números pseudo-aleatorios a partir de una semilla. Y el número generado será siempre el mismo para un número semilla dado. Es decir, si no cambiamos la semilla, la invocación a la función RANDOM nos devolverá siempre el mismo número. De ahí que se denominen pseudo-aleatorios.

Entonces, ¿qué podemos hacer para que nunca invoquemos a RANDOM con la misma semilla? ¿cómo podemos ir consiguiendo números semilla siempre distintos de los anteriores? Pues una forma típica de hacerlo es recurrir a la función CURRENT DATE para crearlos.

FUNCTION CURRENT-DATE

Básicamente, lo que haremos es extraer la Fecha y la Hora (que incluirá hasta las centésimas de segundo) del CURRENT DATE actual y usar ese número como semilla para la obtención de un número aleatorio mediante la función RANDOM.

Obsérvese que una semilla extraída así, con Fecha y Hora, nunca podrá ser igual. Es decir, la Fecha-Hora en un momento dado será 20131203121501 y, un segundo después, será 20131203121502, un número distinto. Y si hacemos la consulta dentro de un año, a la misma hora, será 20141203121502, otro número totalmente distinto de los dos anteriores.

Por tanto, la Fecha-Hora nos va a permitir obtener siempre una semilla totalmente distinta de las que nuestro programa ha podido obtener alguna vez en el pasado. Y, por tanto, eso hará que nuestra función RANDOM genere un número aleatorio totalmente nuevo.

Teniendo en cuenta lo anteriormente indicado, podríamos simular un Dado (en este caso, de 100 caras o, lo que es lo mismo, un Simulador de Percentil) en nuestro programa Cobol de la siguiente forma.

*                                                     
     MOVE FUNCTION CURRENT-DATE TO DATE-TODAY
*                                   
     MOVE FECHA-HORA TO SEMILLA                       
     COMPUTE NUM-RANDOM = FUNCTION RANDOM(SEMILLA)    
       * 10000000000000000                            
     COMPUTE PERCENTIL = NUM-RANDOM / 100000000000000 
     MOVE PERCENTIL TO PERCENTIL-D                      

*

Donde las variables estarán definidas del siguiente modo.

*                           
 01 DATE-TODAY.             
   05 FECHA-HORA  PIC 9(16).
   05 GUION-D     PIC X(1). 
   05 GMT-H       PIC X(2). 
   05 GMT-M       PIC X(2). 
*                             

 01 SEMILLA    PIC 9(16).           
 01 NUM-RANDOM PIC 9(16) COMP-3.    
*                                    

 01 PERCENTIL   PIC 999V99.
 01 PERCENTIL-D PIC ZZ9,99.
*                           


Como vemos, lo que hace esta rutina es cargar la fecha actual en DATE-TODAY. A continuación, se mueve la subvariable FECHA-HORA a la SEMILLA de la función RANDOM. Finalmente, se calcula el PERCENTIL a partir del número aleatorio generado.

La ejecución de esta rutina Cobol muestra la siguiente información:

LEIDOS: 000000000000001             
CURRENT-DATE: 2013120205182478-0600 
FECHA-HORA  : 2013120205182478      
SEMILLA   : 2013120205182478        
NUM-RANDOM: 3017732446555855        
PERCENTIL :  30,17 %                      
***                                       
                            

Como vemos, en este ejemplo hemos generado el número aleatorio 30,17. Tal y como lo hemos definido, nuestro "Dado" obtendrá números entre 0 y 100. Sin embargo, la rutina puede ser fácilmente modificada para obtener únicamente números entre 1 y 6, con lo que tendríamos un "verdadero" Dado.

Y eso es todo. Es evidente que, en el mundo Cobol, en la mayoría de las ocasiones la función RANDOM no no será útil, pero siempre es bueno saber que está ahí, por si algún día la necesitamos.


Saludos.

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...