SoloCodigo

Programación General => ASM (Ensamblador) => Mensaje iniciado por: andyros en Viernes 14 de Mayo de 2004, 13:04

Título: Se Puede Crear Una Rutina Random ?
Publicado por: andyros en Viernes 14 de Mayo de 2004, 13:04
Hola a todos ,    :D  :D   he creado un programa para el pic 16f84a , basicamente es un programa que escoge los numeros de la loteria primitiva , mediante pulsador.


Si presionamos el pulsador escoge un numero , lo elimina de la cuenta , ( para que no vuelva a salir y no se repitan ) y lo visualiza en  2 displays de 7 segmentos.

Y asi con los 6 numeros , ahora se me habia ocurrido , que solo con una pulsacion el pic genere los 6 numeros al azar , vamos , que realice una apuesta automatica,
y que sea aleatoria y sin ninguna logica , lo que pasa es que no se como hacerlo , si alguien tiene alguna idea .  :kicking:  :kicking:

SALUDOS
Título: Re: Se Puede Crear Una Rutina Random ?
Publicado por: deldar en Viernes 14 de Mayo de 2004, 13:27
Tendrás que crear una funcion matematica que te de un numero dentro de un rango partiendo de una semilla (valor inicial) que puedes obener del reloj del sistema
Título: Re: Se Puede Crear Una Rutina Random ?
Publicado por: andyros en Viernes 14 de Mayo de 2004, 14:19
Hola Deldar, gracias por contestar,  podrias concretar un poco mas , con algun ejemplo .

SALUDOS
Título: Re: Se Puede Crear Una Rutina Random ?
Publicado por: deldar en Viernes 14 de Mayo de 2004, 18:32
El reloj del sistema está en el segmento de memoria 40h desplazamiento 6Ch   contiene tics de reloj (1/18,2 segundos) ocurridos desde medianoche, suponemos que lo guardamos la parte alta en Dx y la baja en Ax, ahora procedemos a aumentar la aleatoriedad (evidentemente al varia más que dh). Una opción es  p.ej:

xor ah,al
xor dl,ah
xor dh,dl

(valdría cualquier operacion lógica que altere en base a al para aumentar al, en cualquier caso esto es opcional, la variacion de Al debería ser suficiente)

Si deseamos obtener el valor dentro de un rango por ejemplo 0-60 dividimos entre 60 y tomamos como resultado el resto (dx)

mov bx,60
div bx

Si el rango fuera entre p.ej. 5-60 dividiriamos entre 55 (60 - 5) y al resultado le sumamos 5

mov bx,55
div bx
add dx,5

si deseamos podemo hacer que un rango de valores nos de un único valor p.ej 0..3=0, 4..6=1 etc para esto el divisor lo multiplicamos por 3 com lo que 55*3=165
y el resto lo dividimos entre 3 tomando como resultado el cociente.

mov bx,165
div bx
add dx,5
mov ax,dx
mov bl,3
div bl
(resultado aleatorio en Al)

Y podemos continuar. Al fin de cuentas se trata de intentar que el número no sea claramente predecible y que todos los valores tengan igual probabilidad.

Un Saludo. B)
Título: Re: Se Puede Crear Una Rutina Random ?
Publicado por: Amilius en Jueves 3 de Junio de 2004, 04:18
Aqui va el código fuente del random para enteros que usa delphi, tal vez sea de utilidad para alguien:

Para el caso práctico RandSeed es una "variable global", se la inicializa con el método del timer que expuso deldar: (Ojo es para 32bits)

procedure     _RandInt;
asm
{     ->EAX     Rango   } // el resultado va de 0 a EAX-1
{     <-EAX     Result  }
        IMUL    EDX,RandSeed,08088405H
        INC     EDX
        MOV     RandSeed,EDX
        MUL     EDX
        MOV     EAX,EDX
end;