Página 1 de 3

Número aleatorio 0-100 en Z80

Publicado: 18 Dic 2016, 22:45
por Uto
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

Re: Número aleatorio 0-100 en Z80

Publicado: 19 Dic 2016, 00:35
por Demiurgo
Toma sólo los dos últimos dígitos... 8-[

Re: Número aleatorio 0-100 en Z80

Publicado: 19 Dic 2016, 00:48
por explorer
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.

Re: Número aleatorio 0-100 en Z80

Publicado: 19 Dic 2016, 02:31
por PabloMarmol
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.

Re: Número aleatorio 0-100 en Z80

Publicado: 19 Dic 2016, 10:09
por Uto
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%.

Re: Número aleatorio 0-100 en Z80

Publicado: 19 Dic 2016, 17:44
por Namek
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:

Re: Número aleatorio 0-100 en Z80

Publicado: 31 Dic 2016, 12:38
por Luna
Y si...

10 RND=A
20 A*100

Re: Número aleatorio 0-100 en Z80

Publicado: 31 Dic 2016, 19:33
por Namek
Luna escribió:Y si...

10 RND=A
20 A*100


Mande??? :shock:

Re: Número aleatorio 0-100 en Z80

Publicado: 31 Dic 2016, 20:49
por Tolaemon
Estos algoritmos para generar números "pseudoaleatorios" son muy prácticos, tienes para diferentes rango de valores:
https://en.wikipedia.org/wiki/Xorshift

Re: Número aleatorio 0-100 en Z80

Publicado: 02 Ene 2017, 20:00
por Luna
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?