Marcando la diferencia

@ Generación de pseudo números aleatorios


@ generación de pseudo números aleatorios a través de algoritmo preestablecido.

Desarrollo e investigación realizado por integrantes de la Rama del IEEE de la UCSA, ejemplos de código disponibles para todo público.

https://ramaucsa.files.wordpress.com/2011/04/ensamblador.jpg?w=300

Una gran cantidad de los compiladores y herramientas de desarrollo incluyendo programas para cálculos utilizan el reloj de la computadora como “semilla” para generar los números aleatorios, conocidos como Randomize o “seed random numbers”, dependiendo del lenguaje o herramientas pueden tener diferentes nombres pero generalmente utilizan los mismos algoritmos.

En la intención de poner al descubierto la metodología utilizada, pongo a su disposición el código desensamblado de tales rutinas pertenecientes al Compilador de Delphi. Espero que tales rutinas les sea de ayuda.

Reconociendo además que las rutinas tienen pequeñas dificultades, como la repetición de la serie después de una cantidad definida de iteraciones, si no es muy riguroso con la precisión del resultado se puede utilizar estas rutinas preestablecidas. Pero ocasionalmente los números aleatorios se utilizan en su gran mayoría en la simulación de juegos y otras cuestiones afines. O ciertas aplicaciones que no requieran un uso exhaustivo de las funciones de los números aleatorios que merezca realizar cálculos para elaborar otros códigos de generación aleatoria, de hecho también pueden generar números aleatorios en cálculos de probabilidades. Pero recomiendo también realizar un vistazo general en otros materiales matemáticos dedicados a números aleatorios. Entonces podrá elegir el método que más le sea favorable.

El código en Delphi es <Random.pas>

    var valor: integer;

begin
randomize;
valor: = random(1);
end.

He traducido el Ensamblado (Desensamblado del código fuente a objeto) y lo convertí en Lenguaje Ensamblador para su mejor entendimiento, y es este el que les facilito para que puedan echarle un vistazo y analizarlo. Y repasar o adquirir destreza en el desarrollo en código ensamblador.

GENERACIÓN DE NÚMEROS ALEATORIOS.   – ARCHIVO <RANDOM.ASM>

.model small                ; modelo de memoria pequero, 64k código y datos.
.stack 100h                    ; reserva de memoria para pila
.data                               ; variables del segmento de datos
   semilla1   dw   0        ; variable que contiene la primera semilla
   semilla2   dw   0        ; variable que contiene la segunda semilla
   valor          dw   0        ; variable que contiene el valor devuelto valor = Random(1)
   multi         dw 8405h ; variable utilizada para multiplicar.
.code                                                   ; segmento de código
INICIO:
mov ax,@data
mov ds,ax
call RANDOMIZE       ; llamar a RANDOMIZE
mov ax,1                      ; llamar a  RANDOM con argumento 1
push ax                        ; RANDOM(1) – guardar el argumento actual
call RANDOM               ; LLAMAR A LA FUNCIÓN RANDOM ;VALOR = RANDOM(1)
mov valor,ax
SALIR:                             ; (Finalizar el Programa)
mov ah,04ch
int 21h                           ; llamada al Sistema Operativo
proc RANDOMIZE near      ; función para inicializar semilla de nros. Aleatorios
 mov ah,2Ch                        ; Función del sistema operativo (lectura Tiempo del Sistema)
 int 21h                                 ; llamada al Sistema-  Servicio 2Ih
 mov semilla1 , CX             ; retorna (ch) hora    : (cl) miminuto
 mov semilla2 , DX             ; retorna (dh) segundo : (dl) centesimas de segundo
 ret                                           ; Retornar al llamador
endp
proc RANDOM near                     ; funcion Random
 call CALCULORND                     ; llamar a CALCULORND
 xor ax,ax                                      ; AX=0
 mov bx,sp                                     ; bx = la dirección del puntero de pila
 mov bx,ss:[bx+2]                         ; bx = el argumento actual (obtenido de la pila)
 or   bx,bx                                       ; bx = bx or bx, es cero?
 je SALIDA                                      ; Saltar a SALIDA: Si es igual a Cero
 xchg dx,ax                                     ; intercambiar (dx,ax)
 div bx                                             ; dividir: ax = ax/bx
 xchg dx,ax                                     ; intercambiar (dx,ax)
 SALIDA: ret 0002                          ; retornar y liberar memoria asignado
                                                           ; para el argumento actual (en la pila)
endp
proc CALCULORND near    ; funcion de calculo de RND
 mov ax, semilla1               ; ax=semilla1
 mov bx, semilla2               ; bx=semilla2
 mov cx,ax                             ; cx=ax
  mul multi                          ; multiplicar: dx:ax = ax * multi
 shl cx,1                                  ; cx = cx / 2
 add ch,cl                               ; ch = ch + cl
 add dx,bx                             ; dx= dx + bx
 shl bx,1                                 ; bx = bx / 2
 add dh,bl                              ; dh = dh + bl
 shl bx,cl                                ; bx = bx / cl
 add bh,bl                               ; bh = bh + bl
 add ax,0001                          ; ax =  ax+ 0001
 add dx,0000                          ; dx = dx + 0000
 mov semilla1,ax                  ; semilla1 = ax
 mov semilla2,dx                  ; semilla2 = dx
 ret                                            ; retornar al llamador
endp
end


3 comentarios

  1. Karol M.M

    Muchísimas gracias, en verdad me sirvió mucho!! Dios te bendiga…

    12 diciembre, 2011 en 1:38 AM

    • MUCHAS GRACIAS POR EL COMENTARIO, ESO SIEMPRE NOS AYUDA A CONTINUAR CON ESTA LABORA. SINCERAMENTE MUCHAS GRACIAS!!!

      12 diciembre, 2011 en 2:00 AM

  2. nALLELY

    MUCHAS GRACIAS NO PODRIAS PONER UN EJEMPLO SENCILLO PARA VER COMO IMPLEMENTARLO Xd

    5 febrero, 2012 en 5:29 PM

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s