• Miércoles 20 de Noviembre de 2024, 12:21

Autor Tema:  Se Puede Crear Una Rutina Random ?  (Leído 4055 veces)

andyros

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Se Puede Crear Una Rutina Random ?
« en: Viernes 14 de Mayo de 2004, 13:04 »
0
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

deldar

  • Miembro activo
  • **
  • Mensajes: 93
    • Ver Perfil
Re: Se Puede Crear Una Rutina Random ?
« Respuesta #1 en: Viernes 14 de Mayo de 2004, 13:27 »
0
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
Quien de verdad sabe de qué habla, no encuentra razones para levantar la voz.

andyros

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Se Puede Crear Una Rutina Random ?
« Respuesta #2 en: Viernes 14 de Mayo de 2004, 14:19 »
0
Hola Deldar, gracias por contestar,  podrias concretar un poco mas , con algun ejemplo .

SALUDOS

deldar

  • Miembro activo
  • **
  • Mensajes: 93
    • Ver Perfil
Re: Se Puede Crear Una Rutina Random ?
« Respuesta #3 en: Viernes 14 de Mayo de 2004, 18:32 »
0
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)
Quien de verdad sabe de qué habla, no encuentra razones para levantar la voz.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Se Puede Crear Una Rutina Random ?
« Respuesta #4 en: Jueves 3 de Junio de 2004, 04:18 »
0
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;