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?
Respostas:
"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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte