Генераторы случайных чисел, использующие вывод GPIO?


22

Я только что прочитал вопрос Генератор случайных чисел AVR и столкнулся с несколькими способами генерации случайных семян в AVR:

  • Используйте специальный «Безопасный AVR»
  • Используйте внутренний датчик температуры
  • Читать неписанную EEPROM
  • Измерьте интервалы времени между пользовательским вводом
  • Используйте плавающий контакт АЦП.

Почему бы не просто один цифровой вывод, сконфигурированный как вход без подтягивания и плавающий? В теории это должно генерировать поток случайных битов. Почему бы не использовать это? Слишком медленно меняется состояние? Это имеет тенденцию застревать в 1 или 0? Есть еще проблемы?


1
Безопасный AVR мёртв,
AFAIK

1
Разве неписанный eeprom не всегда 0xFF?
вс

@ vsz, может быть, если ты напишешь что-нибудь и забудешь то, что написал, это «случайно». смешно.
Vorac

Ответы:


5

«Случайный» - хитрое слово. В некоторых контекстах это просто означает «непредсказуемый», но в других контекстах, в частности, связанных с обработкой сигналов и криптографией, это означает «статистически некоррелированный».

Даже если значение, считываемое с плавающей булавки, непредсказуемо («случайное» в первом смысле), оно вряд ли будет полезным во втором смысле.


15

Очевидное различие между использованием цифрового входа и аналогового состоит в том, что в аналоговом режиме возможен больший диапазон начальных значений.

Во-вторых, но, возможно, более важно: если плавающее «медианное» значение цифрового вывода не точно посередине между уровнями логического восприятия (которые не являются уровнями шины питания и заземления, но пороговыми значениями переключения для входной схемы), результирующий поток битов будет иметь сильное смещение в сторону 1 или 0. Это смещение искажает семена намного сильнее, чем искажение аналоговых уровней.

Потребовалось бы очень мало связи, либо от соседних следов или сигналов, либо через какое-то резистивное подтягивание / опускание, спроектированное или случайное, чтобы подтолкнуть «плавающий» цифровой штырь к размыканию - и это также может произойти после развертывание. В проектировании любой конструкции лучше избегать такой формы отказа.


14

Плавающий ввод не определен. Он может дать вам случайные биты, но он также может застрять в 0 или 1. Большую часть времени он застрянет. И когда он действительно плавает, это может вызвать повышенный системный шум и энергопотребление. Плавающие входы, как правило, плохо, даже если входы ни для чего не используются.


Мало того, что он застрянет в 0 или 1 в течение некоторого времени, но если два транзистора, которые составляют первую ступень входного буфера, не будут идеально сбалансированы, или если какой-либо внешний источник тока на пути так или иначе, вход будет плавать до 1 или до 0 в конце концов.
WJL

9

Самое простое решение - построить аппаратную схему генератора случайных сигналов из неправильно используемой транзисторной схемы с открытым коллектором. Используйте вывод битового потока на вход микроконтроллера. Сэмплируйте входящие биты с интервалами. Чтобы обеспечить примерно четное число единиц и нулей, просто используйте изменение состояния как 1, а не изменение как ноль. Google для транзисторного генератора шума для получения дополнительной информации.


Интересный. Как выглядит «неправильно используемая транзисторная схема с открытым коллектором»?
Стивен Коллингс

7
@Remiel - Вы меняете смещение базы-эмиттера транзистора, и оно действует как действительно дурацкий стабилитрон. Вы берете очень шумный стабилитрон и усиливаете шум, чтобы получить случайный битовый поток. См. Robseward.com/misc/RNG2
Коннор Вольф,

3

Один генератор случайных чисел, доступный во многих микроконтроллерах, - это ошибка между двумя источниками тактовых импульсов (возможно, одним внутренним и другим внешним). Когда вы сравниваете их, они слегка дрейфуют из-за шума, и это можно использовать.

В конце концов, это зависит от того, для чего это нужно? Немного рандомизации, и вы даже можете использовать контакт АЦП, подключенный к ничего. Или просто используйте алгоритм как

Творец Мерсенна http://en.wikipedia.org/wiki/Mersenne_twister

Нет, если это криптографически безопасно, но достаточно для большинства целей.


это подход, принятый в примечании к приложению msp430 в предыдущем предыдущем вопросе, насколько мне известно, система синхронизации AVR не поддерживает эту технику
vicatcu

Правильный. Все еще должно быть возможно сделать это с тем же источником синхронизации, даже если это не поддерживается напрямую.
Густаво Литовский

3

Качество случайного начального числа и его алгоритма определяется величиной энтропии или неопределенности в каждом случайном бите. Тогда лучший генератор семени использует высокую энтропию с очень небольшим числом шагов, а не много шагов с низкой энтропией.

Хороший пример высокой энтропии использует метод латинских квадратов для случайного начального числа.

Плавающий вход легко смещен недостатками, утечкой или шумом входа.


0

В микропроцессоре PIC18F вам нужно иметь начальное число для случайного числа. Начальное число может быть любым от 0 до 32767 (15 бит). Я бы посоветовал в начале программы сделать один из выводов и вывод аналогового входа. Прочитайте этот вывод и возьмите младший бит и поместите его в 16-битную переменную. Затем сдвиньте переменную влево на 1. Считайте вывод еще раз и поместите младший бит результата АЦП в первый бит переменной, в которой вы сохранили последний бит. Сдвиг влево еще раз .....

Повторяйте это, пока у вас не будет 15 битов в вашей переменной. Это число, которое вы должны положить в свое семя.

После того, как вы это сделаете, вы можете просто сделать аналоговый входной вывод цифровым входным контактом и включить его слабое усиление или сделать его цифровым выходным контактом. Любой из них остановит эту булавку от плавания.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.