Je viens de lire la question AVR Random Number Generator et j'ai rencontré un certain nombre de façons de générer des graines aléatoires dans un AVR:
- Utilisez un "AVR sécurisé" spécial
- Utilisez un capteur de température interne
- Lire l'EEPROM non écrite
- Mesurer les intervalles de temps entre l'entrée utilisateur
- Utilisez une broche ADC flottante.
Pourquoi pas juste une seule broche numérique, configurée en entrée sans pull-up et flottante? En théorie, cela devrait générer un flux de bits aléatoires. Pourquoi ne pas l'utiliser? L'État change-t-il trop lentement? A-t-il tendance à rester bloqué à 1 ou 0? D'autres problèmes?
Réponses:
"Aléatoire" est un mot délicat. Dans certains contextes, cela signifie simplement «imprévisible», mais dans d'autres contextes - en particulier ceux associés au traitement du signal et à la cryptographie - cela signifie «statistiquement non corrélé».
Même si la valeur lue à partir d'une broche flottante est imprévisible ("aléatoire" dans le premier sens), il est peu probable qu'elle soit utile dans le second sens.
la source
La différence évidente entre l'utilisation d'une entrée numérique et d'une entrée analogique est qu'il existe une plus grande plage de valeurs de départ possible en analogique.
Deuxièmement, mais peut-être plus crucial: si la valeur "médiane" flottante de la broche numérique n'est pas précisément à mi-chemin entre les niveaux de détection logique (qui ne sont pas les niveaux de puissance et de rail de masse, mais les seuils de commutation pour les circuits d'entrée), le flux binaire résultant aura un un fort biais vers 1 ou 0. Ce biais biaise les graines beaucoup plus fortement qu'un biais dans les niveaux analogiques.
Il faudrait très peu de couplage, soit à partir de traces ou de signaux à proximité, soit par le biais d'un pull-up / pull-down résistif, qu'il soit conçu ou accidentel, pour pousser une broche numérique "flottante" à flotter - et cela pourrait aussi se produire après déploiement. Dans l'ingénierie de toute conception, il est préférable d'éviter cette forme de mode de défaillance.
la source
Une entrée flottante n'est pas définie. Il pourrait vous donner des bits aléatoires, mais il pourrait également avoir tendance à rester bloqué à 0 ou 1. La plupart du temps, il restera bloqué. Et quand il est vraiment flottant, il peut entraîner une augmentation du bruit du système et de la consommation d'énergie. Les entrées flottantes sont généralement une mauvaise chose, même lorsque les entrées ne sont utilisées pour rien.
la source
La solution la plus simple consiste à construire un circuit générateur de signal aléatoire matériel à partir d'un circuit transistor à collecteur ouvert mal utilisé. Utilisez la sortie du flux binaire vers une entrée du microcontrôleur. Échantillonnez les bits entrants à intervalles. Pour garantir un nombre à peu près pair de 1 et de 0, utilisez simplement le changement d'état comme 1 et aucun changement comme zéro. Google pour le générateur de bruit de transistor pour plus d'informations.
la source
Un générateur aléatoire qui est disponible dans de nombreux microcontrôleurs est l'erreur entre deux sources d'horloge (peut-être une interne et une autre externe). Lorsque vous les comparez, ils dérivent légèrement à cause du bruit et peuvent être utilisés.
En fin de compte, cela dépend de ce dont vous avez besoin? Un peu de randomisation et vous pouvez même utiliser une broche ADC connectée à rien. Ou utilisez simplement un algorithme comme
Twister de Mersenne http://en.wikipedia.org/wiki/Mersenne_twister
Aucun si c'est cryptographiquement sécurisé, mais assez bon pour la plupart des utilisations.
la source
La qualité d'une graine aléatoire et de son algorithme est déterminée par la quantité d'entropie ou d'incertitude dans chaque bit aléatoire. Ensuite, le meilleur générateur d'une graine utilise une entropie élevée avec très peu d'étapes plutôt que de nombreuses étapes d'entropie faible.
Un bon exemple d'entropie élevée utilise la méthode des carrés latins pour une graine aléatoire.
L'entrée flottante est facilement biaisée par des défauts, des fuites ou des bruits d'entrée.
la source
Dans un microprocesseur PIC18F, vous devez avoir une valeur de départ pour le nombre aléatoire. La valeur de départ peut être comprise entre 0 et 32 767 (15 bits). Je suggérerais au début du programme que vous fassiez l'une des broches et une broche d'entrée analogique. Lisez cette broche et prenez le bit le moins significatif et mettez-le dans une variable de 16 bits. Décalez ensuite la variable vers la gauche de 1. Relisez la broche et placez le LSB du résultat ADC dans le premier bit de la variable dans laquelle vous avez stocké le dernier bit. Décalez de nouveau vers la gauche .....
Répétez cette opération jusqu'à ce que vous ayez 15 bits dans votre variable. C'est le nombre que vous devez mettre dans votre graine.
Après avoir fait cela, vous pouvez simplement faire de la broche d'entrée analogique une broche d'entrée numérique et activer une traction faible vers le haut, ou en faire une broche de sortie numérique. Soit on arrêtera cette broche de flotter.
la source