Acabo de leer la pregunta AVR Random Number Generator y encontré varias formas de generar semillas aleatorias en un AVR:
- Utilice un "AVR seguro" para fines especiales
- Use un sensor de temperatura interno
- Leer EEPROM no escrita
- Medir intervalos de tiempo entre la entrada del usuario
- Use un pin ADC flotante.
¿Por qué no un solo pin digital, configurado como entrada sin pull-up y flotante? En teoría, eso debería generar un flujo de bits aleatorios. ¿Por qué no usar esto? ¿El estado está cambiando muy lentamente? ¿Tiende a atascarse en 1 o 0? ¿Algún otro problema?
Respuestas:
"Aleatorio" es una palabra difícil. En algunos contextos, simplemente significa "impredecible", pero en otros contextos, en particular los asociados con el procesamiento de señales y la criptografía, significa "estadísticamente no correlacionado".
Incluso si el valor leído desde un pin flotante es impredecible ("aleatorio" en el primer sentido), no es probable que sea útil en el segundo sentido.
fuente
La diferencia evidente entre el uso de una entrada digital y una analógica es que existe un mayor rango de valores semilla posibles en analógico.
En segundo lugar, pero quizás más crucial: si el valor "mediano" flotante del pin digital no está precisamente a medio camino entre los niveles de detección lógica (que no son los niveles de potencia y tierra, sino los umbrales de conmutación para el circuito de entrada), el flujo de bits resultante tendrá un fuerte sesgo hacia 1 o 0. Este sesgo sesga las semillas mucho más fuertemente que un sesgo en los niveles analógicos.
Se necesitaría muy poco acoplamiento, ya sea de trazas o señales cercanas, o mediante algún pull-up / pull-down resistivo, ya sea diseñado o accidental, para empujar un pin digital "flotante" para que no se flote, y eso también podría suceder después de despliegue. En la ingeniería de cualquier diseño, es mejor evitar esta forma de modo de falla.
fuente
Una entrada flotante no está definida. Podría darle bits aleatorios, pero también podría tender a quedarse atascado en 0 o 1. La mayoría de las veces se quedará atascado. Y cuando realmente está flotando, puede causar un aumento en el ruido del sistema y el consumo de energía. Las entradas flotantes generalmente son algo malo, incluso cuando las entradas no se utilizan para nada.
fuente
La solución más simple es construir un circuito generador de señal aleatoria de hardware a partir de un circuito de transistor de colector abierto mal utilizado. Utilice la salida de flujo de bits a una entrada en el microcontrolador. Muestree los bits entrantes a intervalos. Para asegurar un número más o menos par de 1s y 0s, simplemente use el cambio de estado como 1 y no cambie como cero. Google para generador de ruido de transistores para más información.
fuente
Un generador aleatorio que está disponible en muchos microcontroladores es el error entre dos fuentes de reloj (quizás una interna y otra externa). Cuando los comparas, se desplazan ligeramente debido al ruido y eso se puede usar.
Al final, ¿para qué lo necesitas? Un poco de aleatorización e incluso puedes usar un pin ADC conectado a nada. O simplemente use un algoritmo como
Twister Mersenne http://en.wikipedia.org/wiki/Mersenne_twister
Ninguno si esto es criptográficamente seguro, pero lo suficientemente bueno para la mayoría de los propósitos.
fuente
La calidad de una semilla aleatoria y su algoritmo están determinados por la cantidad de entropía o incertidumbre en cada bit aleatorio. Entonces, el mejor generador de una semilla usa alta entropía con muy pocos pasos en lugar de muchos pasos de baja entropía.
Un buen ejemplo de alta entropía utiliza el método de cuadrados latinos para una semilla aleatoria.
La entrada flotante es fácilmente sesgada por fallas, fugas o ruido de entrada.
fuente
En un microprocesador PIC18F, debe tener una semilla para el número aleatorio. La semilla puede ser de 0 a 32767 (15 bits). Sugeriría al comienzo del programa que haga uno de los pines y el pin de entrada analógica. Lea este pin y tome el bit menos significativo y póngalo en una variable de 16 bits. Luego, cambie la variable a la izquierda en 1. Lea nuevamente el pin y coloque el LSB del resultado del ADC en el primer bit de la variable en la que almacenó el último bit. Cambie a la izquierda nuevamente .....
Repita esto hasta que tenga 15 bits en su variable. Este es el número que necesita poner en su semilla.
Después de haber hecho esto, puede simplemente hacer que el pin de entrada analógica sea un pin de entrada digital y habilitar un pull up débil, o convertirlo en un pin de salida digital. Cualquiera evitará que este pin flote.
fuente