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
Número aleatorio 0-100 en Z80
- Demiurgo
- Amstrad PC 1640
- Mensajes: 601
- 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: 199 veces
Re: Número aleatorio 0-100 en Z80
Toma sólo los dos últimos dígitos... 

Web del CAAD (Club de Aventuras AD): https://caad.club
- explorer
- MSX Turbo R
- Mensajes: 443
- 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: 162 veces
- Contactar:
Re: Número aleatorio 0-100 en Z80
100 no es fácil de deducir a partir de una ristra de bits:
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.
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.
- PabloMarmol
- 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: 18 veces
- Gracias recibidas: 18 veces
Re: Número aleatorio 0-100 en Z80
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.
- Uto
- MSX Turbo R
- Mensajes: 445
- 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: 29 veces
Re: Número aleatorio 0-100 en Z80
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%.
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
Twitter: @uto_dev
- Namek
- Atari 1040 STf
- Mensajes: 840
- Registrado: 11 Jul 2011, 13:13
- Gracias dadas: 18 veces
- Gracias recibidas: 63 veces
Re: Número aleatorio 0-100 en Z80
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.

- Namek
- Atari 1040 STf
- Mensajes: 840
- Registrado: 11 Jul 2011, 13:13
- Gracias dadas: 18 veces
- Gracias recibidas: 63 veces
- Tolaemon
- Amiga 1200
- Mensajes: 1056
- Registrado: 16 May 2004, 22:29
- Gracias dadas: 28 veces
- Gracias recibidas: 21 veces
Re: Número aleatorio 0-100 en Z80
Estos algoritmos para generar números "pseudoaleatorios" son muy prácticos, tienes para diferentes rango de valores:
https://en.wikipedia.org/wiki/Xorshift
https://en.wikipedia.org/wiki/Xorshift
-
- Amiga 1200
- Mensajes: 1981
- 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: 31 veces
- Gracias recibidas: 31 veces
- Contactar:
Re: Número aleatorio 0-100 en Z80
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???
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?
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado