Перейти к содержанию
    

Случайные числа

Как реализовать в кейле генератор случайных чисел для 51 контроллера? Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как реализовать в кейле генератор случайных чисел для 51 контроллера? Заранее спасибо.

Функция "rand()":

 

http://www.mir-koda.ru/full_leson.php?id=8

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Функция "rand()":

 

http://www.mir-koda.ru/full_leson.php?id=8

 

 

Функция "rand()":

 

http://www.mir-koda.ru/full_leson.php?id=8

 

 

Функция "rand()":

 

http://www.mir-koda.ru/full_leson.php?id=8

 

Фнкция Rand будет выдавать одно и тоже число, если не использовать srand. А в srand надо записывать разные числа. По приведенной выше ссылке туда записывается time(NULL).

Для контроллеров нет такой функции!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фнкция Rand будет выдавать одно и тоже число, если не использовать srand

Какой именно у вас МК ? Можно же взять, например, шум младшего разряда АЦП. Или время, проходящее от момента запуска любой из PLL до того момента, как она засинхронизируется (именно так я делал на LPC214x, результат очень приличный). Думайте, думайте. Я уже молчу о том, что внешний аналоговый генератор шума можно собрать на каком-нибудь стабилитроне ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думайте, думайте. Я уже молчу о том, что внешний аналоговый генератор шума можно собрать на каком-нибудь стабилитроне ...

С PLL да, интересно. А с внешним стабилитроном - это до тех пор, пока "пацаны-то не знают"

Потом сразу начинается закорачивание входов на массу и т.д. и результат srand становится абсолютно предсказуемым

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтение таймера в произвольный момент времени. Период таймера желательно иметь меньше чем период чтения его содержимого, ну и чтение должно быть несильно ко времени привязано. Можно взять два таймера, с разной частотой (периодом) счета и брать функцию от них (сумма, XOR, перемножение с отбрасыванием младшей (старшей) части, выбор из области кода по полученному индексу). Для особо продвинутых моделей можно задействовать встроенный датчик температуры для получения ШУМА АЦП.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтение таймера в произвольный момент времени.

Вот в этом и проблема. Неясно, какой именно момент времени считать произвольным - они все так или иначе детерминированы программой, исполняющейся в МК. Я этого дела наелся по самые уши, понапробовался всяких "моментов" и больше не хочу - качество случайных чисел, генерируемых таким образом, получается очень низким. А вообще, хорошие генераторы используют множество источников энтропии, а не один. Я в своем проекте остановился на генераторе FORTUNA, разработанном Брюсом Шнайером и Нильсом Фергюсоном, который "кормлю" энтропией из пяти или шести источников:

http://www.rsdn.ru/res/book/security/practicalcrypto.xml

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если есть часы реального времени, можно их использовать.

Если есть органы управления, замерить время между X и Y нажатиями на кнопки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стандартная функция генерации псевдослучайных чисел, в качестве seed можно использовать, например, показания часов реального времени (если есть), время нажатия на какие-либо кнопки (если они есть), шум младших разрядов АЦП, и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В классическом 8051 без АЦП, RTC, EEPROM и.т.п. можно использовать содержимое озу при включении. На всякий случай можно перексорить весь объем.

А на случай ресета, одну ячейку непрерывно менять, инкрементировать на 1 например.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...