SoloCodigo
Programación General => ASM (Ensamblador) => Mensaje iniciado 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
-
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
-
Hola Deldar, gracias por contestar, podrias concretar un poco mas , con algun ejemplo .
SALUDOS
-
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)
-
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;