Número aleatorio 0-100 en Z80

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
Uto
MSX Turbo R
MSX Turbo R
Mensajes: 442
Registrado: 28 Abr 2014, 15:50
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: TV Games/Pong Clone
Gracias dadas: 5 veces
Gracias recibidas: 26 veces

Número aleatorio 0-100 en Z80

Mensajepor Uto » 18 Dic 2016, 22:45

Hola,

¿Se os ocurre alguna manera de obtener un número pseuedo-aleatorio entre 0 y 100?

He encontrado esta rutina que obtiene un número de 0 a 255, y claro, podría hacer lo siguiente: obtener el valor entre 0 y 255, dividirlo por dos (con lo que queda entre 0 y 127), y si el número es >100 repetir hasta que salga un número dentro de rango, pero claro, eso de repetir hasta que salga pues le da una variabilidad enorme al tiempo de ejecución de la rutina.

Edito:
La rutina de 0-255, que olvidé enlazarla:
http://www.z80.info/pseudo-random.txt
http://www.ngpaws.com
Twitter: @uto_dev

Avatar de Usuario
Demiurgo
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 578
Registrado: 26 Oct 2014, 11:04
Sistema Favorito: MSX
primer_sistema: (Otro)
consola_favorita: Vectrex
Primera consola: Sega Game Gear
Gracias dadas: 81 veces
Gracias recibidas: 178 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor Demiurgo » 19 Dic 2016, 00:35

Toma sólo los dos últimos dígitos... 8-[
Web del CAAD (Club de Aventuras AD): https://caad.club

Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 396
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias dadas: 2 veces
Gracias recibidas: 138 veces
Contactar:

Re: Número aleatorio 0-100 en Z80

Mensajepor explorer » 19 Dic 2016, 00:48

100 no es fácil de deducir a partir de una ristra de bits:

Código: Seleccionar todo

01100100

Se puede dividir el problema partes: random(95) + random(3) + random(2)

Los dos primeros random() se pueden hacer fácilmente haciendo random(x) { RAND & x }

El segundo es más complicado, por lo que quizás sea más sencillo hacer un "rerolling" (volver a intentarlo):

random(2) { do { y = RAND & 3 } while (y == 3); y }

Ahora bien... ya que 100 es aprox. la mitad de 256, se podría hacer un "rerolling" hasta que el valor sea menor o igual que 100:

random(100) { do { y = RAND / 2 } until (y<=100); y }

El número de operaciones es menor, a costa de arriesgarnos a tener que generar unos cuántos números más.

Seguro que hay otras opciones.

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 171
Registrado: 03 Sep 2012, 17:32
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Primera consola: Nintendo NES/Clónica
Ubicación: León, España
Gracias dadas: 16 veces
Gracias recibidas: 18 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor PabloMarmol » 19 Dic 2016, 02:31

hazle el "módulo 101" (¿seguro que es de 0 a 100?), imagino que eso será mas barato que repetir el cálculo del número aleatorio.

Avatar de Usuario
Uto
MSX Turbo R
MSX Turbo R
Mensajes: 442
Registrado: 28 Abr 2014, 15:50
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: TV Games/Pong Clone
Gracias dadas: 5 veces
Gracias recibidas: 26 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor Uto » 19 Dic 2016, 10:09

Gracias a todos por las respuestas.

Hacer el módulo 101 no es barato en ensamblador, dado que el Z80 no tiene ninguna instrucción MOD y no quisiera tener que tirar de la ROM. Además, el módulo daría una distribución no uniforme, porque hay más posibilidades de que el resto dé los números bajos que los altos. Quedarse con las dos últimas cifras es un módulo 100, que tiene el mismo problema, además de no poder dar 100 como resultado, pero deja ver mejor el problema de la solución "módulo": el 55, 155 y 255 darían 55, pero solo el 56 y 156 darían 56, con lo cual es mucho más posible que salga un número por debajo de 55 que por encima.

Si lo hago dividiendo por dos y luego haciendo el módulo me pasa lo mismo con los números hasta el 28, que tendrían más posibilidades de salir.

La descomposición en factores es otra posibilidad, aunque coincido con el análisis de que al final es mejor quedarnos como estamos, es decir, dividiendo por 2 y haciendo reroll si se pasa de 100. La otra opción garantiza tener que hacer tres rolls, y no descarta tener que hacer rerolls después, y además las posibilidades de tener que hacer reroll en el RND(3) son mayores que las de tener que hacerlo en el RND(128) , 25% vs ~20%.
http://www.ngpaws.com
Twitter: @uto_dev

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor Namek » 19 Dic 2016, 17:44

Uto escribió:¿Se os ocurre alguna manera de obtener un número pseuedo-aleatorio entre 0 y 100?

He encontrado esta rutina que obtiene un número de 0 a 255, y claro, podría hacer lo siguiente: obtener el valor entre 0 y 255, dividirlo por dos (con lo que queda entre 0 y 127), y si el número es >100 repetir hasta que salga un número dentro de rango, pero claro, eso de repetir hasta que salga pues le da una variabilidad enorme al tiempo de ejecución de la rutina.

Hombre lo mas facil es restar 100 si el numero es mayor de 100 con el consiguiente problema de que los valores de 1 a 27 tendrian mas posibilidades de salir. :roll:

Luna
Amiga 1200
Amiga 1200
Mensajes: 1974
Registrado: 01 Jun 2013, 16:21
Sistema Favorito: PC
primer_sistema: ZX81
consola_favorita: Sega Saturn
Primera consola: Atari 2600
Ubicación: Republica de catalunya
Gracias dadas: 30 veces
Gracias recibidas: 28 veces
Contactar:

Re: Número aleatorio 0-100 en Z80

Mensajepor Luna » 31 Dic 2016, 12:38

Y si...

10 RND=A
20 A*100

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor Namek » 31 Dic 2016, 19:33

Luna escribió:Y si...

10 RND=A
20 A*100


Mande??? :shock:

Avatar de Usuario
Tolaemon
Amiga 1200
Amiga 1200
Mensajes: 1056
Registrado: 16 May 2004, 22:29
Gracias dadas: 28 veces
Gracias recibidas: 20 veces

Re: Número aleatorio 0-100 en Z80

Mensajepor Tolaemon » 31 Dic 2016, 20:49

Estos algoritmos para generar números "pseudoaleatorios" son muy prácticos, tienes para diferentes rango de valores:
https://en.wikipedia.org/wiki/Xorshift

Luna
Amiga 1200
Amiga 1200
Mensajes: 1974
Registrado: 01 Jun 2013, 16:21
Sistema Favorito: PC
primer_sistema: ZX81
consola_favorita: Sega Saturn
Primera consola: Atari 2600
Ubicación: Republica de catalunya
Gracias dadas: 30 veces
Gracias recibidas: 28 veces
Contactar:

Re: Número aleatorio 0-100 en Z80

Mensajepor Luna » 02 Ene 2017, 20:00

Namek escribió:
Luna escribió:Y si...

10 RND(0)=A
12 rem En ordenadores tipo msx2 se puede poner el seed a la variable time 10 rnd(time)=a
20 A*100


Mande??? :shock:


llevo años sin tocar basic, pero ahora se me ha ocurrido este bugfix, o si no, caray, quien no se acuerda de sacar numeros aleatorios en BASIC?


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados