Generación de números aleatorios en Z80 (u otro de 8 bits)
Publicado: 07 Nov 2018, 02:21
¡Jarl, torpedos! Estoy ahora interesado en generar un número pseudo-aleatorio (en adelante, número aleatorio) en el Z80, con ciertas carasterísticas:
- De 0 a 255, uséase, que ocupe 1 byte
- Existe un byte en la RAM, llamado (SEED), que contiene un número aleatorio. Este número es realmente el número de microsegundos truncados a 1 byte que el usuario ha tardado en pulsar una tecla.
- No puedo acceder a ninguna otra posición de memoria, ni a ROM ni a RAM, sólo a (SEED)
He visto un hilo por ahí que trataba de generar un número del 0 al 100, pero la solución de fondo no la hi entendido bien.
Yo no soy matemático, y por tanto no entiendo de teorías del "randomizismo", jiji, pero sí intuyo que cualquier operación matemática que realice partiendo de (SEED), me dará otro byte, y el poblema está en que si ese byte vuelve a ser el mismo que (SEED), se bloquea la generación de números aleatorios.
Otro poblema, aunque menor, es que se (SEED)=58 p.ej., y F(58)=123, y F(123)=42, si ahora F(42)=58, volvemos a iniciar la semilla y por tanto el algoritmo F sólo me generaría 3 números aleatorios, y siempre esos 3: 58, 123 y 42.
Si intentamos arreglar esto haciendo que la semilla cambie tras generar el número aleatorio, vemos que aparentemente se solucionan los bloqueos y ciclos cortos:
(SEED)=58, F(58)=123 y (SEED)=17 p.ej., F(17)=66 y (SEED)=90, F(90)=58 y (SEED)=178
Pero tampoco, ya que basta con que el algoritmo produzca un (SEED)=58, para que de nuevo esta "aleatoriedad" sea cíclica.
¿Cómo resuelven los pogramadores este jaleo?
- De 0 a 255, uséase, que ocupe 1 byte
- Existe un byte en la RAM, llamado (SEED), que contiene un número aleatorio. Este número es realmente el número de microsegundos truncados a 1 byte que el usuario ha tardado en pulsar una tecla.
- No puedo acceder a ninguna otra posición de memoria, ni a ROM ni a RAM, sólo a (SEED)
He visto un hilo por ahí que trataba de generar un número del 0 al 100, pero la solución de fondo no la hi entendido bien.
Yo no soy matemático, y por tanto no entiendo de teorías del "randomizismo", jiji, pero sí intuyo que cualquier operación matemática que realice partiendo de (SEED), me dará otro byte, y el poblema está en que si ese byte vuelve a ser el mismo que (SEED), se bloquea la generación de números aleatorios.
Otro poblema, aunque menor, es que se (SEED)=58 p.ej., y F(58)=123, y F(123)=42, si ahora F(42)=58, volvemos a iniciar la semilla y por tanto el algoritmo F sólo me generaría 3 números aleatorios, y siempre esos 3: 58, 123 y 42.
Si intentamos arreglar esto haciendo que la semilla cambie tras generar el número aleatorio, vemos que aparentemente se solucionan los bloqueos y ciclos cortos:
(SEED)=58, F(58)=123 y (SEED)=17 p.ej., F(17)=66 y (SEED)=90, F(90)=58 y (SEED)=178
Pero tampoco, ya que basta con que el algoritmo produzca un (SEED)=58, para que de nuevo esta "aleatoriedad" sea cíclica.
¿Cómo resuelven los pogramadores este jaleo?