¿Generadores de números aleatorios usando un pin GPIO?

21

Acabo de leer la pregunta AVR Random Number Generator y encontré varias formas de generar semillas aleatorias en un AVR:

  • Use un "AVR seguro" para propósitos especiales
  • Use un sensor de temperatura interno
  • Lee la EEPROM no escrita
  • Medir intervalos de tiempo entre las entradas del usuario
  • Use un pin de ADC flotante.

¿Por qué no solo un único 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? ¿Está cambiando el estado demasiado lentamente? ¿Tiende a quedarse en 1 o 0? ¿Algún otro problema?

    
pregunta Vorac

7 respuestas

5

"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.

    
respondido por el Dave Tweed
15

La diferencia evidente entre el uso de una entrada digital y una analógica es que hay un mayor intervalo de valores semilla posibles en la analógica.

Segundo, pero quizás más importante: si el valor "mediano" flotante del pin digital no se encuentra precisamente a medio camino entre los niveles de sentido lógico (que no son los niveles de potencia y riel a 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 niveles analógicos.

Se necesitaría muy poco acoplamiento, ya sea de huellas o señales cercanas, oa través de algún levantamiento / arrastre resistivo, ya sea diseñado o accidental, para empujar un pin digital "flotante" a flote, y eso también podría suceder después de la implementación. En la ingeniería de cualquier diseño, es mejor evitar esta forma de modo de falla.

    
respondido por el Anindo Ghosh
14

Una entrada flotante no está definida. Podría darle bits aleatorios, pero también podría tender a atascarse en un 0 o 1. La mayoría de las veces se atascará. Y cuando está realmente flotando, podría aumentar el ruido del sistema y el consumo de energía. Las entradas flotantes son generalmente algo malo, incluso cuando las entradas no se utilizan para nada.

    
respondido por el user3624
9

La solución más simple es construir un circuito generador de señal aleatorio de hardware a partir de un circuito de transistor de colector abierto mal utilizado. Use la salida de flujo de bits para una entrada en el microcontrolador. Muestra los bits entrantes a intervalos. Para garantizar un número aproximado de 1s y 0s, simplemente use el cambio de estado como un 1 y ningún cambio como un cero. Google para el generador de ruido de transistores para más información.

    
respondido por el chris
3

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 desvían ligeramente debido al ruido y se pueden usar.

¿Al final depende de para qué lo necesites? Un poco de aleatorización e incluso puedes usar un pin ADC conectado a nada. O simplemente use un algoritmo como

Twister de Mersenne enlace

Ninguno si esto es criptográficamente seguro, pero es lo suficientemente bueno para la mayoría de los propósitos.

    
respondido por el Gustavo Litovsky
3

La calidad de una semilla aleatoria y su algoritmo está determinada por la cantidad de entropía o incertidumbre en cada bit aleatorio. Entonces, el mejor generador de una semilla usa una 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 Cuadrados latinos para una semilla aleatoria.

La entrada flotante es fácilmente influenciada por fallas, fugas o ruidos de entrada.

    
respondido por el Tony EE rocketscientist
0

En un microprocesador PIC18F, debe tener una semilla para el número aleatorio. La semilla puede ser desde 0 hasta 32767 (15 bits). Yo sugeriría que al inicio del programa usted 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, desplace la variable hacia la izquierda en 1. Lea el pin de nuevo y coloque el LSB del resultado del ADC en el primer bit de la variable en la que guardó el último bit. Mueva a la izquierda nuevamente .....

Repita esto hasta que tenga 15 bits en su variable. Este es el número que necesitas poner en tu semilla.

Después de hacer esto, puede simplemente hacer que el pin de entrada analógica se convierta en un pin de entrada digital y habilitar un levantamiento débil, o convertirlo en un pin de salida digital. Cualquiera de los dos detendrá la flotación de este pin.

    
respondido por el portreathbeach

Lea otras preguntas en las etiquetas