Proyecto MSX, Autentico generador de numeros aleatorios.

Sistemas MSX y derivados (Sony, Philips, ...)
Luna
Amiga 1200
Amiga 1200
Mensajes: 1976
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: 29 veces
Contactar:

Proyecto MSX, Autentico generador de numeros aleatorios.

Mensajepor Luna » 05 Ago 2013, 15:48

Una cosa que sabemos, es que un ordenador no 'sabe' generar numeros aleatorios, a base de una tabla interna y un 'seed' introducido, generan numeros cuasi-aleatorios...

Intentos de conseguir aleatorios reales: Como la tabla interna no se puede cambiar (tampoco serviría) Se puede intentar que el 'seed' sea aleatorio, así los numeros generados si sería aleatorios...

En MSX2 o superior, podemos utilizar como seed la variable 'time' que depende del reloj interno, curiosamente no he encontrado la variable para el calendario...
Otra opción sería implementar una batería de sensores aprovechando la especificación 'paddle' de los puertos de controladores, (6 paddles por puerto, semi-analogicos con 256 valores) ya que el paddle no es más que un potenciometro, este se puede substituir por un termopar o termometro electrico, cuya resistencia varia según la temperatura, Implementar una rutina que saque un promedio de cada 'paddle' (uno al sol, uno dentro de casa, uno a la sombra, uno dentro de una lata al sol)... Y luego saque la media, y asigne dicha media a una variable que sea el seed...

Por otro lado, tengo entendido que existen estaciones meteorologicas que pueden sacar un registro mediante puerto serie, Temperatura, Presión, Higrómetro, precipitación, vientos... Todos preciosos numeritos que se pueden leer desde el MSX, combinar y emplear como Seed... Autenticos numeros aleatorios... :meparto:

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2991
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 70 veces
Gracias recibidas: 338 veces
Contactar:

Re: Proyecto MSX, Autentico generador de numeros aleatorios.

Mensajepor zup » 05 Ago 2013, 16:05

Luna escribió:Intentos de conseguir aleatorios reales: Como la tabla interna no se puede cambiar (tampoco serviría) Se puede intentar que el 'seed' sea aleatorio, así los numeros generados si sería aleatorios...


FALSO (o al menos, parcialmente falso). Muchos generadores de números aleatorios dependen de la semilla, y reintroducen el resultado como nueva semilla. Esto produce una secuencia de números pseudoaleatorios, pero con dos limitaciones:

- Conociendo el último término de la serie, se puede predecir el siguiente.
- Si introducimos dos veces la misma semilla, la serie de números se repetirá.

Lo único que se consigue con meter una semilla aleatoria sería obtener una serie aleatoria de entre una selección de series de números pseudoaleatorios.

Para que realmente sea una serie aleatoria, deberías "renovar" esa semilla cada vez que generes un número; por ejemplo podrías combinar la semilla con algún dato aleatorio y reintroducirla como semilla. Así cada número generado dependerá de un valor que no puedes controlar.

La idea de usar sensores de presión, temperatura, humedad y esas cosas no es mala, pero para mejorar la cosa deberías forzar las cosas al límite de la precisión o tomar valores que realmente peguen "saltos". Pensando en el sensor de temperatura...

- 21 grados en una habitación es un valor que ya me gustaría tener en casa, pero cambia leeeentamente. Quizás de cada 100 medidas, 95 tienen el mismo valor.
- 21.7 va mejorando, esa décima de grado cambiará más rápido. Otro problema es que el siguiente valor será uno de tres: o 21.7 o 21.8 o 21.6.
- 21.73 es mucho mejor, las centésimas de grado cambian muchísimo más rápido.
- 21.737 ya es la hostia... la milésima cambiará casi a cada medida, lo que te dará un buen número aleatorio. Quizás incluso las siguientes medidas suban o bajen varias milésimas de golpe, lo que las hará más imprecisas.

Quizás mejor todavía sería hacer un hash de la medida y después mezclarlo con la semilla que tenías. Al usar un hash en vez de la medida en sí, conseguirás que los valores de la semilla peguen "botes" más grandes y mejore la obtención de números aleatorios.

Todo eso, suponiendo que realmente quieras números aleatorios. Para seguridad informática es muy importante, para la mayoría de los juegos con los números pseudoaletorios normales va que se mata.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
scooter
Amiga 1200
Amiga 1200
Mensajes: 1031
Registrado: 17 Jul 2012, 09:25
primer_sistema: C64
Ubicación: Alicante

Re: Proyecto MSX, Autentico generador de numeros aleatorios.

Mensajepor scooter » 05 Ago 2013, 16:25

Puedes sacar la semilla de la hora a la que enciendes el bicho, como supongo que no lo usas de servidor y lo enciende todos los días con el wake on lan o algo así , será bastante aleatorio

Luna
Amiga 1200
Amiga 1200
Mensajes: 1976
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: 29 veces
Contactar:

Re: Proyecto MSX, Autentico generador de numeros aleatorios.

Mensajepor Luna » 05 Ago 2013, 17:18

scooter escribió:Puedes sacar la semilla de la hora a la que enciendes el bicho, como supongo que no lo usas de servidor y lo enciende todos los días con el wake on lan o algo así , será bastante aleatorio


Eso ya lo tengo... Pero te creerás que he estado despierto hasta las 3:00 pensando en como mejorarlo... <XX

Avatar de Usuario
mentalthink
Amiga 2500
Amiga 2500
Mensajes: 2840
Registrado: 11 Abr 2010, 15:06
Gracias dadas: 45 veces
Gracias recibidas: 14 veces

Re: Proyecto MSX, Autentico generador de numeros aleatorios.

Mensajepor mentalthink » 05 Ago 2013, 17:50

Es interesante esto, no hace mucho estuve leyendo un libro de estructuras, segíun tengo entendido no se puede hacer un número aleatorio real, pero os comento está idea, aunque supongo que iría ralentizando el tema muchísimo... y tampoco voy a venir a reinventar la rueda que no tengo ni papa de programación.

Si pones un valor entre 0 y 1000 y cojes la mitad , el 500, este 500 lo guardas en un array y vas verificando que no se repita... acto seguido eliges un número al azar entre [1 o 499] o [501 y 999] y el que dé lo pones en ese array de verificación , por ejemplo sale el 72.

A medida que verificas y vas creando no puedes repetirlos porque los tienes en esa lista y por lo tanto no sé si es aleatorio al 100 pero se evitaria siempre la repetición...

Cuando me refiero de 0 a 1000, podría ser de 0 a 1000. millones o subiendo de escala en rangos de números, asi si ese array que vigila que no se repitan se podria borrar y empezar en otro rango haciendo la misma acción pero al pasar del 0 a 1000 - 1000 a 2000 los números serían distintos

Como digo aleatorio no se si se refiere a que nunca se repite o a que haya la misma posibilidad entre números, aunque dividiendo por 2 4 o 6 se cumpliría también esa condición.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: Proyecto MSX, Autentico generador de numeros aleatorios.

Mensajepor mcleod_ideafix » 05 Ago 2013, 17:53

Sistemas de generación de números aleatorios de alta calidad ya se implantaron hace bastantes años en el chipset de los Pentiums. El procedimiento es sencillo y puede replicarse en un MSX o en cualquier otra máquina: un generador de ruido blanco.
Esencialmente: un circuito con transistores en donde uno de ellos tiene el terminal de colector al aire (no conectado), más un amplificador de muy alta ganancia. El resultado, si se eligen bien los componentes, es un ruido que al digitalizarse genera una cadena aleatoria de 0's y 1's, que pueden usarse como pool de entropía para un generador de números pseudoaleatorios. Algo como esto:

Imagen

O estre otro, en el que el zéner es la fuente de ruido (el efecto avalancha de los electrones, supongo...)

Imagen

En otros sistemas, como Linux, en donde hay varios dispositivos que están generando interrupciones, se usan algunas de éstas, las que no son periódicas, también para alimentar a ese pool de entropía (que en Linux está implementado dentro del núcleo), de forma que cuando se consulta /dev/random se va generando cada vez un número aleatorio de bastante calidad. El pool de entropía de Linux se nutre, entre otras cosas, de las interrupciones del teclado (el tiempo que ocurre entre una pulsación y la siguiente no es el mismo), y de las del ratón. Creo que también se usa la interrupción de la tarjeta de red, y alguna otra más.

Cuando se instala un gestor de interrupción en Linux, uno de los valores que se le da a la función que lo registra, request_irq, es un flag que puede tener varios valores, entre ellos:

Código: Seleccionar todo

 IRQF_SAMPLE_RANDOM - irq is used to feed the random generator


Volviendo al MSX: puedes usar el circuito anteriormente mencionado, con el dato convertido a 0's y 1's, conectado al puerto de joystick. Leyéndolo, obtendrás cada vez un nuevo valor. Más información...
http://en.wikipedia.org/wiki/Hardware_r ... _generator

O más sencillo aún: conectar el circuito al puerto de cassette, que ya está preparado para leer tensiones que no sean digitales, y leer éste desde el MSX. O más sencillo aún: no hace falta que hagas el circuito. Coge una radio FM, sintonízala en una frecuencia en la que no haya nada, y alimenta la entrada de cassette con el ruido que saca. Lee el puerto de cassette y cuando tengas 8 bits leídos, ya tienes un valor aleatorio, o semilla para un PRNG.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
mentalthink
Amiga 2500
Amiga 2500
Mensajes: 2840
Registrado: 11 Abr 2010, 15:06
Gracias dadas: 45 veces
Gracias recibidas: 14 veces

Re: Proyecto MSX, Autentico generador de numeros aleatorios.

Mensajepor mentalthink » 05 Ago 2013, 18:30

El primer circuito si que es interesante a parte de sencillo,entonces por lo que supongo si cojes esa ristra y la vas cortando en 8 bits conseguirias el número aleatorio de 512 de una manera correcta, supongo que en un rango tan pequeño se repetiria rapidamente el numero pero en vez de 8 bits, si cojes 128 o 256, sería más complea la repetición?¿

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: Proyecto MSX, Autentico generador de numeros aleatorios.

Mensajepor mcleod_ideafix » 05 Ago 2013, 18:43

mentalthink escribió:El primer circuito si que es interesante a parte de sencillo,entonces por lo que supongo si cojes esa ristra y la vas cortando en 8 bits conseguirias el número aleatorio de 512 de una manera correcta, supongo que en un rango tan pequeño se repetiria rapidamente el numero pero en vez de 8 bits, si cojes 128 o 256, sería más complea la repetición?¿

Que una secuencia repita números no la hace menos aleatoria. Un número verdaderamente aleatorio lo será independientemente de si su rango va de 0 a 255, o de 0 a 65535, o... de 0 a 1. Una secuencia se dice aleatoria cuando no puedes predecir de ninguna forma qué número saldrá a continuación. De hecho, si una secuencia de números, de N bits cada uno, es aleatoria, la secuencia de bits individuales de cada número, emitida en serie uno detrás de otro, también lo es.

DIcho esto, hay que tener en cuenta que ciertos mecanismos que se usan para la generación de números aleatorios pueden no dar secuencias completamente aleatorias, y se habla entonces de mecanismos que dan números de N bits, pero de esos N bits, sólo una porción de ellos es realmente aleatoria. Un ejemplo clásico es la función rand() de la librería de C. Esta función da valores pseudoaleatorios entre 0 y RAND_MAX, donde RAND_MAX suele ser 32767 o mayor.

Pues bien: se aconseja siempre que se use esta función, quedarse con los bits más altos del resultado, ya que son lo más aleatorios. Es decir, que si vas a usar rand() para simular una tirada de un dado, haz esto...

Código: Seleccionar todo

tirada = 1+rand()*5/RAND_MAX;

En lugar de esto otro (que se queda precisamente con los bits menos significativos del resultado)

Código: Seleccionar todo

tirada = 1+rand()%6;


Aquí lo explican mejor... y de hecho he visto que la forma en la que yo genero el resultado tampoco es la óptima...
http://www.thinkage.ca/english/gcos/exp ... /rand.html
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
Joss
Atari 1040 STf
Atari 1040 STf
Mensajes: 930
Registrado: 17 Jul 2012, 20:07
Gracias dadas: 14 veces
Gracias recibidas: 2 veces

Re: Proyecto MSX, Autentico generador de numeros aleatorios.

Mensajepor Joss » 05 Ago 2013, 21:47

Curioso lo que contáis. Y yo que pensaba que seguían siendo pseudo-aleatorios .... me quedé en la época del CPC ..... :oops: ( me refiero a la implementación integrada en el Pentium y al tema del linux)

Luna
Amiga 1200
Amiga 1200
Mensajes: 1976
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: 29 veces
Contactar:

Re: Proyecto MSX, Autentico generador de numeros aleatorios.

Mensajepor Luna » 20 Ago 2013, 00:40

Pensamiento aleatorio:

Ahora que me ha llegado el turbo R, he pensado que puedo capturar la señal del micro y agregarla como un sub-seed más a la rutina que genera el seed que genera numeros aleatorios...


Volver a “MSX”

¿Quién está conectado?

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