Я только что прочитал вопрос Генератор случайных чисел AVR и столкнулся с несколькими способами генерации случайных семян в AVR:
- Используйте специальный «Безопасный AVR»
- Используйте внутренний датчик температуры
- Читать неписанную EEPROM
- Измерьте интервалы времени между пользовательским вводом
- Используйте плавающий контакт АЦП.
Почему бы не просто один цифровой вывод, сконфигурированный как вход без подтягивания и плавающий? В теории это должно генерировать поток случайных битов. Почему бы не использовать это? Слишком медленно меняется состояние? Это имеет тенденцию застревать в 1 или 0? Есть еще проблемы?
Ответы:
«Случайный» - хитрое слово. В некоторых контекстах это просто означает «непредсказуемый», но в других контекстах, в частности, связанных с обработкой сигналов и криптографией, это означает «статистически некоррелированный».
Даже если значение, считываемое с плавающей булавки, непредсказуемо («случайное» в первом смысле), оно вряд ли будет полезным во втором смысле.
источник
Очевидное различие между использованием цифрового входа и аналогового состоит в том, что в аналоговом режиме возможен больший диапазон начальных значений.
Во-вторых, но, возможно, более важно: если плавающее «медианное» значение цифрового вывода не точно посередине между уровнями логического восприятия (которые не являются уровнями шины питания и заземления, но пороговыми значениями переключения для входной схемы), результирующий поток битов будет иметь сильное смещение в сторону 1 или 0. Это смещение искажает семена намного сильнее, чем искажение аналоговых уровней.
Потребовалось бы очень мало связи, либо от соседних следов или сигналов, либо через какое-то резистивное подтягивание / опускание, спроектированное или случайное, чтобы подтолкнуть «плавающий» цифровой штырь к размыканию - и это также может произойти после развертывание. В проектировании любой конструкции лучше избегать такой формы отказа.
источник
Плавающий ввод не определен. Он может дать вам случайные биты, но он также может застрять в 0 или 1. Большую часть времени он застрянет. И когда он действительно плавает, это может вызвать повышенный системный шум и энергопотребление. Плавающие входы, как правило, плохо, даже если входы ни для чего не используются.
источник
Самое простое решение - построить аппаратную схему генератора случайных сигналов из неправильно используемой транзисторной схемы с открытым коллектором. Используйте вывод битового потока на вход микроконтроллера. Сэмплируйте входящие биты с интервалами. Чтобы обеспечить примерно четное число единиц и нулей, просто используйте изменение состояния как 1, а не изменение как ноль. Google для транзисторного генератора шума для получения дополнительной информации.
источник
Один генератор случайных чисел, доступный во многих микроконтроллерах, - это ошибка между двумя источниками тактовых импульсов (возможно, одним внутренним и другим внешним). Когда вы сравниваете их, они слегка дрейфуют из-за шума, и это можно использовать.
В конце концов, это зависит от того, для чего это нужно? Немного рандомизации, и вы даже можете использовать контакт АЦП, подключенный к ничего. Или просто используйте алгоритм как
Творец Мерсенна http://en.wikipedia.org/wiki/Mersenne_twister
Нет, если это криптографически безопасно, но достаточно для большинства целей.
источник
Качество случайного начального числа и его алгоритма определяется величиной энтропии или неопределенности в каждом случайном бите. Тогда лучший генератор семени использует высокую энтропию с очень небольшим числом шагов, а не много шагов с низкой энтропией.
Хороший пример высокой энтропии использует метод латинских квадратов для случайного начального числа.
Плавающий вход легко смещен недостатками, утечкой или шумом входа.
источник
В микропроцессоре PIC18F вам нужно иметь начальное число для случайного числа. Начальное число может быть любым от 0 до 32767 (15 бит). Я бы посоветовал в начале программы сделать один из выводов и вывод аналогового входа. Прочитайте этот вывод и возьмите младший бит и поместите его в 16-битную переменную. Затем сдвиньте переменную влево на 1. Считайте вывод еще раз и поместите младший бит результата АЦП в первый бит переменной, в которой вы сохранили последний бит. Сдвиг влево еще раз .....
Повторяйте это, пока у вас не будет 15 битов в вашей переменной. Это число, которое вы должны положить в свое семя.
После того, как вы это сделаете, вы можете просто сделать аналоговый входной вывод цифровым входным контактом и включить его слабое усиление или сделать его цифровым выходным контактом. Любой из них остановит эту булавку от плавания.
источник