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...
Proyecto MSX, Autentico generador de numeros aleatorios.
- zup
- 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.
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!
Además vendo cosas!
- scooter
- Amiga 1200
- Mensajes: 1031
- Registrado: 17 Jul 2012, 09:25
- primer_sistema: C64
- Ubicación: Alicante
Re: Proyecto MSX, Autentico generador de numeros aleatorios.
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
-
- 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.
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...
- mentalthink
- 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.
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.
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.
- mcleod_ideafix
- 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.
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:
O estre otro, en el que el zéner es la fuente de ruido (el efecto avalancha de los electrones, supongo...)
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:
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.
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:
O estre otro, en el que el zéner es la fuente de ruido (el efecto avalancha de los electrones, supongo...)
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
- mentalthink
- 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.
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?¿
- mcleod_ideafix
- 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.
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
- Joss
- 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.
Curioso lo que contáis. Y yo que pensaba que seguían siendo pseudo-aleatorios .... me quedé en la época del CPC ..... ( me refiero a la implementación integrada en el Pentium y al tema del linux)
-
- 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.
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...
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...
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados