Полная версия этой страницы:
Случайные числа
Как реализовать в кейле генератор случайных чисел для 51 контроллера? Заранее спасибо.
kovigor
Apr 19 2013, 10:27
Цитата(LoLo @ Apr 19 2013, 08:37)

Как реализовать в кейле генератор случайных чисел для 51 контроллера? Заранее спасибо.
Функция "rand()":
http://www.mir-koda.ru/full_leson.php?id=8
Цитата(kovigor @ Apr 19 2013, 14:27)

Фнкция Rand будет выдавать одно и тоже число, если не использовать srand. А в srand надо записывать разные числа. По приведенной выше ссылке туда записывается time(NULL).
Для контроллеров нет такой функции!!!
kovigor
Apr 19 2013, 13:04
Цитата(LoLo @ Apr 19 2013, 13:48)

Фнкция Rand будет выдавать одно и тоже число, если не использовать srand
Какой именно у вас МК ? Можно же взять, например, шум младшего разряда АЦП. Или время, проходящее от момента запуска любой из PLL до того момента, как она засинхронизируется (именно так я делал на LPC214x, результат очень приличный). Думайте, думайте. Я уже молчу о том, что внешний аналоговый генератор шума можно собрать на каком-нибудь стабилитроне ...
toweroff
Apr 22 2013, 07:23
Цитата(kovigor @ Apr 19 2013, 17:04)

Думайте, думайте. Я уже молчу о том, что внешний аналоговый генератор шума можно собрать на каком-нибудь стабилитроне ...
С PLL да, интересно. А с внешним стабилитроном - это до тех пор, пока "пацаны-то не знают"
Потом сразу начинается закорачивание входов на массу и т.д. и результат srand становится абсолютно предсказуемым
редактор
Apr 22 2013, 08:22
Чтение таймера в произвольный момент времени. Период таймера желательно иметь меньше чем период чтения его содержимого, ну и чтение должно быть несильно ко времени привязано. Можно взять два таймера, с разной частотой (периодом) счета и брать функцию от них (сумма, XOR, перемножение с отбрасыванием младшей (старшей) части, выбор из области кода по полученному индексу). Для особо продвинутых моделей можно задействовать встроенный датчик температуры для получения ШУМА АЦП.
kovigor
Apr 22 2013, 10:09
Цитата(редактор @ Apr 22 2013, 11:22)

Чтение таймера в произвольный момент времени.
Вот в этом и проблема. Неясно, какой именно момент времени считать произвольным - они все так или иначе детерминированы программой, исполняющейся в МК. Я этого дела наелся по самые уши, понапробовался всяких "моментов" и больше не хочу - качество случайных чисел, генерируемых таким образом, получается очень низким. А вообще, хорошие генераторы используют множество источников энтропии, а не один. Я в своем проекте остановился на генераторе FORTUNA, разработанном Брюсом Шнайером и Нильсом Фергюсоном, который "кормлю" энтропией из пяти или шести источников:
http://www.rsdn.ru/res/book/security/practicalcrypto.xml
Если есть часы реального времени, можно их использовать.
Если есть органы управления, замерить время между X и Y нажатиями на кнопки.
Ещё вариант: инициализировать генератор случайных чисел на этапе калибровки, в дальнейшем сохраняя состояние генератора в энергонезависимой памяти, если есть такая возможность.
Цитата(scifi @ Apr 22 2013, 20:36)

Ещё вариант: инициализировать генератор случайных чисел на этапе калибровки, в дальнейшем сохраняя состояние генератора в энергонезависимой памяти, если есть такая возможность.
это наиболее простой путь

при прошивке задать некий "серийный номер", который при включении питания считать и использовать для srand(), а потом при выключении питания запоминать последнее "случайное" число из rand() на месте серийного номера. в результате каждое изделие будет работать по-своему...
Fujitser
Jun 15 2013, 05:39
Стандартная функция генерации псевдослучайных чисел, в качестве seed можно использовать, например, показания часов реального времени (если есть), время нажатия на какие-либо кнопки (если они есть), шум младших разрядов АЦП, и т.п.
paskal
Jun 16 2013, 18:01
В классическом 8051 без АЦП, RTC, EEPROM и.т.п. можно использовать содержимое озу при включении. На всякий случай можно перексорить весь объем.
А на случай ресета, одну ячейку непрерывно менять, инкрементировать на 1 например.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.