¿Números aleatorios?

Avatar de Usuario
badapower
Mensajes: 502
Registrado: 16 Oct 2012 00:16
Agradecido : 82 veces
Agradecimiento recibido: 102 veces

¿Números aleatorios?

Mensajepor badapower » 07 Ago 2022 19:29

Quería hacer un jueguecito muy simple en BASIC para el MSX y necesitaba generar números aleatorios. Cual ha sido mi sorpresa que haciendo pruebas para comprobar la "aleatoriedad" de los números generados me encuentro que cada vez que ejecuto el programa se genera exactamente la misma secuencia de números que además es la misma secuencia que aparece en el manual del MSX, ¿Dónde está la aleatoriedad si con cada ejecución se genera siempre la misma secuencia de números?
Lo que sale en el manual :
numeros aleatorios MSX BASIC.jpg
numeros aleatorios MSX BASIC.jpg (78.1 KiB) Visto 652 veces

Lo que me sale a mí :
numeros aleatorios en BASIC.jpg
(211.24 KiB) No descargado aún


Da igual el número que pongas entre el paréntesis de la instrucción RND, si es un número positivo va a generar siempre la misma secuencia, ya lo he comprobado, y me ha dejado de piedra, pensaba que servía de algo el número del parentesis, pues no.
Si pones un 0 se repite el número generado anteriormente y si pones un número negativo, el que sea, se genera siempre el mismo número, el primero que sale en el ejemplo del manual :
numeros aleatorios BASIC.jpg
numeros aleatorios BASIC.jpg (100.73 KiB) Visto 652 veces

si pones un -2 se genera el primer número, si pones un -97 también. En este ejemplo que usan en el manual utilizan la variable A para generar un nuevo número aleatorio, pues bien, da igual que pongas la A o que pongas un 1 o un 200, de nuevo te genera siempre la misma secuencia en cada ejecución.

Si con cada ejecución se genera siempre la misma secuencia de números el juego pierde su gracia, ya que es un juego matemático, y si en la 10ª partida ya te sabes de memoria los números que van a salir el juego pierde su objetivo.

¿Alguna idea? Lo de coger la hora no sirve, sea cual sea el número positivo que pongas entre el paréntesis de RND se genera siempre la misma secuencia, por lo menos en MSX, en otros sistemas no lo sé porque todavía no lo he probado.

mad3001
Mensajes: 154
Registrado: 10 Nov 2017 13:30
Agradecido : 59 veces
Agradecimiento recibido: 73 veces

Re: ¿Números aleatorios?

Mensajepor mad3001 » 07 Ago 2022 20:25

Siempre puedes hacer que el usuario colabore... que pulse una tecla para generar el número... inicias una asignación por ejemplo X=RND(0)... y que mientras el usuario no pulsa tecla continúa haciendo X=RND(X).... según tarde más o menos en pulsar saldrá un número pseudo-aletorio
Otra opción si el usuario no va a colaborar sería algo como
X=RND(-TIME)
no se si eso era lo que habías probado

zxpope
Mensajes: 244
Registrado: 02 Ene 2018 02:25
Agradecido : 88 veces
Agradecimiento recibido: 94 veces

Re: ¿Números aleatorios?

Mensajepor zxpope » 07 Ago 2022 20:36

la secuencia es pseudoaletoria
con la misma semilla, retorna la misma secuencia de numeros aleatorios
la semilla la puedes cambiar, usando como valor el tiempo entre la pulsación de dos teclas
o midiendo algo relacionado con el tiempo de barrido de la TV , etc...

aparentemente el gran creador no dejó nada al azar

Avatar de Usuario
carmeloco
Mensajes: 1716
Registrado: 16 Dic 2015 08:56
Agradecido : 10 veces
Agradecimiento recibido: 294 veces

Re: ¿Números aleatorios?

Mensajepor carmeloco » 07 Ago 2022 20:42

Por esa razón se cree que el cartucho del Driver Test (el test de la revisión médica para el carnet de conducir) lleva electrónica extra. Para generar números aleatorios "de verdad". En su día lo estuve hablando con McLeod (que creó un clon de esa electrónica extra con un CPLD) y él llegó a la conclusión de que esa podría ser la razón de añadir esa electrónica extra al cartucho, además de la ROM.

Avatar de Usuario
GuerreroNinja
Mensajes: 346
Registrado: 18 Feb 2021 20:37
Agradecido : 223 veces
Agradecimiento recibido: 164 veces

Re: ¿Números aleatorios?

Mensajepor GuerreroNinja » 07 Ago 2022 21:06

Si es un MSX2 si puedes usar TIME, pero si es para MSX 1 la cosa se complica y hay que usar "trucos" como el tiempo de pulsación de una tecla o botón del joystick desde el inicio del programa. Hay muchos bastante sencillos, no es necesario implementar un algoritmo generador complicado.
Mis niñas favoritas: -m3s3x MSX2+ Wavy 70FD -cocbm1 C64C -coam1 A1200 -4mstr4d CPC6128 -ph34r MiSTer -sp3zy Gomados+

"All that is visible must grow beyond
itself and extend into the realm of
the invisible."

Avatar de Usuario
Peluko
Mensajes: 32
Registrado: 27 Jun 2022 15:47
Agradecido : 18 veces
Agradecimiento recibido: 19 veces

Re: ¿Números aleatorios?

Mensajepor Peluko » 07 Ago 2022 21:14

En MSX 1 se usa TIME en negativa para inicializar la semilla y después llamas a RND(x) con el último valor devuelto de la función. Así:

Imagen

Saludos.
Adjuntos
IMG_6198.JPEG
(775.7 KiB) No descargado aún

Avatar de Usuario
badapower
Mensajes: 502
Registrado: 16 Oct 2012 00:16
Agradecido : 82 veces
Agradecimiento recibido: 102 veces

Re: ¿Números aleatorios?

Mensajepor badapower » 07 Ago 2022 23:14

Perdonar, olvidé comentar que lo estaba probando en un PHILIPS MSX-2 VG-8235.

El manual que estaba consultando era el de SONY y en ese no hacía ninguna referencia al uso de la variable TIME, estaba muy mal explicado, acabo de consultar en otro manual, uno de PHILIPS y aquí si que sale el ejemplo de : X=RND(-TIME)
Y con esto sí que se consigue en cada ejecución una secuencia distinta, pero curiosamente hay que usarla en negativo, si usas la variable TIME en positivo en cada ejecución obtienes la misma secuencia.
Lo que me tiene rallado es que en las pruebas que he estado haciendo esta tarde daba igual qué número negativo le pasara a la función RND que siempre me daba el mismo número, este : ".04389820420821" , daba igual que le pasara un - 1 o un -90 que siempre obtenía ese número, pero ahora ya no, con cada número negativo que le paso me da un número distinto, pero solo en las dos primeras cifras, las otras 12 "389820420821" son siempre las mismas, para alucinar.
La única manera de obtener en cada ejecución una secuencia distinta es usar esto : X=RND(-TIME)

Gracias a todos.

Avatar de Usuario
Peluko
Mensajes: 32
Registrado: 27 Jun 2022 15:47
Agradecido : 18 veces
Agradecimiento recibido: 19 veces

Re: ¿Números aleatorios?

Mensajepor Peluko » 08 Ago 2022 00:32

Usa lo que te he comentado: la primera vez haces un RND(-TIME) y las siguientes haces la llamada con el valor que te ha devuelto la ejecución anterior. Algo como:

10 LET R = RND(-TIME)
... usas R para tus cálculos...
XX R = RND(R)
... usas R para tus cálculos...
XX R = RND(R)
... vuelves a usar R...

La función RND() es pseudoaleatoria, es decir, a partir de un número "semilla" te va a generar siempre la misma secuencia. Dentro de esta secuencia los números son en apariencia aleatorios (pseudo). El truco para hacerlo realmente aleatorio es el uso de la variable TIME como semilla. Esta variable cuenta el número de VBlanks que han pasado desde que arrancas el ordenador (50 por segundo si es PAL). Si haces el RND(-TIME) cuando se pulsa una tecla, o cuando le das a RUN manualmente, por ejemplo, es prácticamente imposible que obtengas dos veces el mismo valor. A partir de ahí vas alimentando la función RND() con el número aleatorio anteriormente generado. Hacerlo así tiene la ventaja de que cuando quieras puedes cambiar el RND(-TIME) por un valor constante y obtener una secuencia de números que ya conoces, lo que te puede ser útil para probar el programa o para depurar. O incluso una forma de tener partidas pre-programadas. Por ejemplo, las famosas semillas de mundos de Minecraft funcionan así. Con un simple numerito obtienes un mundo entero y siempre es el mismo mundo.

Usar siempre -TIME tiene el problema de que si el juego es rápido puedes ejecutar dos veces el RND(-TIME) en el mismo cuadro, por lo que tendrás dos veces la misma semilla y por lo tanto el mismo número resultado. Además, si no recuerdo mal, TIME es de 16 bits, por lo que estás limitando el rango de posibles valores aleatorios a 65536. Y también se reseteará cada 20 minutos más o menos, que no sé si podría ser un problema.

Saludos.

Avatar de Usuario
Nandove
Mensajes: 1453
Registrado: 10 Ene 2011 12:16
Agradecido : 529 veces
Agradecimiento recibido: 324 veces

Re: ¿Números aleatorios?

Mensajepor Nandove » 08 Ago 2022 09:00

Lo siento pero cada vez que se habla de números aleatorios me acuerdo de una de las mejores viñetas de Dilbert:

dilbert (1).png
dilbert (1).png (80.47 KiB) Visto 522 veces

zxpope
Mensajes: 244
Registrado: 02 Ene 2018 02:25
Agradecido : 88 veces
Agradecimiento recibido: 94 veces

Re: ¿Números aleatorios?

Mensajepor zxpope » 08 Ago 2022 11:41

lo bueno de una secuencia pseudo-aleatoria predecible es que puedes
evaluar cambios del diseño sin que te afecte lo aleatorio

por ejemplo, un marciano simpre sandrá en el mismo punto
y disparará con el mismo ángulo y en el mismo instante

eso te permite depurar el programa...

Avatar de Usuario
explorer
Mensajes: 529
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 19 veces
Agradecimiento recibido: 494 veces
Contactar:

Re: ¿Números aleatorios?

Mensajepor explorer » 08 Ago 2022 17:57

O sea... que a partir del momento del primer RND(<número negativo>), se genera una serie de valores aleatorios, que se pueden acceder con argumentos positivos: RND(1), RND(2), ... RND(x).

Entonces... se podría hacer un juego cuya base sea la aleatoridad, que permitiese al jugador volver atrás y encontrarse con los mismos decorados que había antes.

Es el mismo principio de funcionamiento que el generador de pantallas del Pitfall.

Avatar de Usuario
swapd0
Mensajes: 49
Registrado: 21 May 2022 16:11
Agradecido : 7 veces
Agradecimiento recibido: 15 veces

Re: ¿Números aleatorios?

Mensajepor swapd0 » 08 Ago 2022 18:37

Nandove escribió:Lo siento pero cada vez que se habla de números aleatorios me acuerdo de una de las mejores viñetas de Dilbert:

dilbert (1).png

Cuando vi este hilo pensé en esta viñeta XDXDXD

Avatar de Usuario
centurix
Mensajes: 167
Registrado: 18 Ago 2020 17:19
Agradecido : 2 veces
Agradecimiento recibido: 31 veces

Re: ¿Números aleatorios?

Mensajepor centurix » 10 Ago 2022 00:02

Los generadores de números (pseudo) aleatorios de los ordenadores de 8 bits, si no recuerdo mal, se basan todos en aritmética modular que es lo que saben hacer los procesadores utilizando pocos recursos.
El generador es de la forma x(n+1)=a*x(n)+c (mod m),
Donde m es 2^15 para ordenadores de 8 bits o 2^31 para ordenadores de 16/32 bits.
a y m son primos entre sí, c es una constante
por lo que la secuencia siempre es la misma y según la semilla empiezas en diferentes lugares de la lista de números aleatorios (mod m)
-m4c IIcx -j4tar1 800XL 65XE 130XE -c4510 FX-802P -coam1 1100RW

Avatar de Usuario
WhatIsAMan
Mensajes: 1028
Registrado: 10 Dic 2017 17:06
Ubicación: El castillo invertido
Agradecido : 337 veces
Agradecimiento recibido: 383 veces
Contactar:

Re: ¿Números aleatorios?

Mensajepor WhatIsAMan » 10 Ago 2022 19:52

centurix escribió:Los generadores de números (pseudo) aleatorios de los ordenadores de 8 bits, si no recuerdo mal, se basan todos en aritmética modular que es lo que saben hacer los procesadores utilizando pocos recursos.
El generador es de la forma x(n+1)=a*x(n)+c (mod m),
Donde m es 2^15 para ordenadores de 8 bits o 2^31 para ordenadores de 16/32 bits.
a y m son primos entre sí, c es una constante
por lo que la secuencia siempre es la misma y según la semilla empiezas en diferentes lugares de la lista de números aleatorios (mod m)

O, si lo implementan en hardware, LFSR.

Avatar de Usuario
centurix
Mensajes: 167
Registrado: 18 Ago 2020 17:19
Agradecido : 2 veces
Agradecimiento recibido: 31 veces

Re: ¿Números aleatorios?

Mensajepor centurix » 10 Ago 2022 20:48

Si alguien tiene en marcha un Atari de 8 bits puede probar el generador de números aleatorios del POKEY en la dirección $D20A, PEEK(53770)
-m4c IIcx -j4tar1 800XL 65XE 130XE -c4510 FX-802P -coam1 1100RW

Avatar de Usuario
badapower
Mensajes: 502
Registrado: 16 Oct 2012 00:16
Agradecido : 82 veces
Agradecimiento recibido: 102 veces

Re: ¿Números aleatorios?

Mensajepor badapower » 11 Ago 2022 19:40

centurix escribió:Los generadores de números (pseudo) aleatorios de los ordenadores de 8 bits, si no recuerdo mal, se basan todos en aritmética modular que es lo que saben hacer los procesadores utilizando pocos recursos.
El generador es de la forma x(n+1)=a*x(n)+c (mod m),
Donde m es 2^15 para ordenadores de 8 bits o 2^31 para ordenadores de 16/32 bits.
a y m son primos entre sí, c es una constante
por lo que la secuencia siempre es la misma y según la semilla empiezas en diferentes lugares de la lista de números aleatorios (mod m)


Pues algo así pensé hacer yo viendo al principio la poca aleatoriedad de los números, usar alguna función matemática y pasarle la hora.

Pero una vez resuelto el problema ya estoy con el programita, pero hace tanto que no programaba, en Basic unos 35 años y en otros lenguajes unos doce, que me está costando un poco para la mierdecilla que es el jueguín.


Volver a “Software MSX”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado