Geradores de números aleatórios usando um pino GPIO?


22

Acabei de ler a pergunta Generator Random Number do AVR e encontrei várias maneiras de gerar sementes aleatórias em um AVR:

  • Use um "AVR seguro" de finalidade especial
  • Use um sensor de temperatura interno
  • Ler EEPROM não escrita
  • Medir intervalos de tempo entre a entrada do usuário
  • Use um pino ADC flutuante.

Por que não apenas um único pino digital, configurado como entrada sem pull-up e flutuante? Em teoria, isso deve gerar um fluxo de bits aleatórios. Por que não usar isso? O estado está mudando muito lentamente? Tende a ficar preso em 1 ou 0? Algum outro problema?


1
O AVR seguro está morto AFAIK
vicatcu 3/12/12

1
O eeprom não escrito não é sempre 0xFF?
vsz

@ vsz, talvez se você escrever algo e esquecer o que escreveu, agora é "aleatório". ri muito.
Vorac

Respostas:


5

"Aleatório" é uma palavra complicada. Em alguns contextos, significa simplesmente "imprevisível", mas em outros contextos - em particular os associados ao processamento e criptografia de sinais - significa "estatisticamente não correlacionado".

Mesmo que o valor lido de um pino flutuante seja imprevisível ("aleatório" no primeiro sentido), provavelmente não será útil no segundo sentido.


15

A diferença evidente entre o uso de uma entrada digital e uma analógica é que há um maior intervalo de valores de sementes possível em analógico.

Segundo, mas talvez mais crucial: se o valor "mediano" flutuante do pino digital não estiver precisamente no meio do caminho entre os níveis de sentido lógico (que não são os níveis de trilho de potência e de terra, mas os limiares de comutação para o circuito de entrada), o fluxo de bits resultante terá um viés forte em direção a 1 ou 0. Esse viés distorce as sementes com muito mais força do que um distorção nos níveis analógicos.

Seria necessário muito pouco acoplamento, seja de traços ou sinais próximos, ou através de algum pull-up / pull-down resistivo, projetado ou acidental, para empurrar um pino digital "flutuante" para flutuar - e isso também poderia acontecer após desdobramento, desenvolvimento. Ao projetar qualquer projeto, é melhor evitar essa forma de modo de falha.


14

Uma entrada flutuante é indefinida. Ele pode fornecer bits aleatórios, mas também pode ficar preso a 0 ou 1. Na maioria das vezes, ele fica preso. E quando está realmente flutuando, pode causar aumento no ruído do sistema e no consumo de energia. As entradas flutuantes geralmente são uma coisa ruim, mesmo quando as entradas não estão sendo usadas para nada.


Não só ela pode ficar preso em 0 ou 1 por algum tempo, mas a menos que os dois transistores que compõem a primeira fase da entrada de buffer são perfeitamente equilibrado, ou há alguma fonte de corrente externa na forma ou de outra, a entrada irá flutuar até 1 ou até 0, eventualmente.
Wjl 5/09/2015

9

A solução mais simples é construir um circuito gerador de sinal aleatório de hardware a partir de um circuito transistor de coletor aberto mal utilizado. Use a saída de fluxo de bits para uma entrada no microcontrolador. Amostra dos bits recebidos em intervalos. Para garantir um número aproximadamente uniforme de 1s e 0s, basta usar a mudança de estado como 1 e nenhuma alteração como zero. Google para gerador de ruído de transistor para obter mais informações.


Interessante. Como é um "circuito transistor de coletor aberto mal usado"?
Stephen Collings

7
@Remiel - Você inverte a junção base-emissor de um transistor e atua como um zener realmente ruim. Você pega o zener muito barulhento e amplifica o ruído para obter um fluxo de bits aleatório. Veja também robseward.com/misc/RNG2
Connor Wolf

3

Um gerador aleatório disponível em muitos microcontroladores é o erro entre duas fontes de clock (talvez uma interna e outra externa). Quando você os compara, eles flutuam levemente devido ao ruído e podem ser usados.

No final, depende do que você precisa? Um pouco de randomização e você pode até usar um pino ADC conectado a nada. Ou apenas use um algoritmo como

Mersenne twister http://en.wikipedia.org/wiki/Mersenne_twister

Nenhuma, se isso for criptograficamente seguro, mas bom o suficiente para a maioria dos propósitos.


que é a abordagem adoptada na nota msp430 aplicativo na pergunta antes referenciada, ao meu conhecimento do sistema relógio AVR não suporta esta técnica
vicatcu

Corrigir. Ainda deve ser possível fazê-lo com a mesma fonte de relógio, mesmo que não seja diretamente suportado.
Gustavo Litovsky

3

A qualidade de uma semente aleatória e seu algoritmo é determinada pela quantidade de entropia ou incerteza em cada bit aleatório. Então, o melhor gerador de uma semente usa alta entropia com muito poucos passos, em vez de muitos passos de baixa entropia.

Um bom exemplo de alta entropia usa o método Latin Squares para uma semente aleatória.

A entrada flutuante é facilmente influenciada por falhas, vazamentos ou ruídos de entrada.


0

Em um microprocessador PIC18F, você precisa ter uma semente para o número aleatório. A semente pode ser de 0 a 32767 (15 bits). Sugiro que, no início do programa, você faça um dos pinos e o pino de entrada analógica. Leia este pino, pegue o bit menos significativo e coloque-o em uma variável de 16 bits. Em seguida, desloque a variável para a esquerda em 1. Leia o pino novamente e coloque o LSB do resultado do ADC no primeiro bit da variável em que você armazenou o último bit. Shift à esquerda novamente .....

Repita isso até ter 15 bits na sua variável. Este é o número que você precisa colocar em sua semente.

Depois de fazer isso, você pode simplesmente transformar o pino de entrada analógica em um pino de entrada digital e permitir uma puxada fraca ou transformá-lo em um pino de saída digital. Qualquer um deles impedirá que este pino flutue.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.