реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Инициализация псевдослучайной последовательности, как это сделать?
ARV
сообщение Mar 11 2011, 05:42
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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

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

вопрос знатокам: посоветуйте, какими простыми и дешевыми средствами реализовать получение хотя бы одного-единственного, но на самом деле случайного числа в программе?

сразу ограничу круг советов: надежда на то, что после включения питания ячейки ОЗУ содержат случайные данные, не срабатывает, в подавляющем большинстве у одного и того же контроллера при более-менее одинаковых условиях содержимое ОЗУ после подачи питания так же более-менее одинаковое, вариации крайне недостаточные для того, чтобы считать их действительно случайными - проверено на некотором количестве atmega32.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ataradov
сообщение Mar 11 2011, 06:29
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



У Атмела есть аппнот на эту тему, номер не помню правда.

В качестве источинков случайных событий в частности там предлагались: АЦП с висящим в воздухе выводом, время записи ячейки EEPROM и много чего еще.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 11 2011, 06:53
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



пока что не нашел такого апноута... с АЦП я пробовал, но что-то не очень хорошо вышло... вроде поначалу показалось есть случайность, а потом она куда-то пропала... правда, я использовал "веру" в то, что младший бит АЦП шумит, и поэтому мерял 8 раз небольшой уровень и младший бит результата задвигал в байт... а вот время записи EEPROM - оно же может зависеть от питания, температуры, частоты встроенного генератора, но для одинаковых условий будет неизменным, как мне кажется... 2 девайса могут получиться с разными последовательностями, но каждое будет всегда стартавать однотипно...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
314
сообщение Mar 11 2011, 07:04
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 17-08-07
Пользователь №: 29 855



Висящий в воздухе вывод АЦП лихо реагирует на влажность платы, можно просто дохнуть на это место платы и показания здорово меняются. Только по-моему это больше проблема, чем решение.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 11 2011, 07:08
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Petka
сообщение Mar 11 2011, 07:24
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(ARV @ Mar 11 2011, 08:42) *
есть, конечно, функция srand(), которая могла бы помочь, но для нужного результата эту функцию нужно передать случайное число... круг замкнулся.

вопрос знатокам: посоветуйте, какими простыми и дешевыми средствами реализовать получение хотя бы одного-единственного, но на самом деле случайного числа в программе?

На самом деле "действительно случайное" число не нужно. Нужно всего-лишь навсего при каждом запуске в srand подсовывать ДРУГОЕ число. Получить его достаточно просто. При каждом запуске инкрементируйте какую-нибудь ячейку EEPROM и данным значением инициализируйте srand.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 11 2011, 07:52
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Petka @ Mar 11 2011, 10:24) *
На самом деле "действительно случайное" число не нужно. Нужно всего-лишь навсего при каждом запуске в srand подсовывать ДРУГОЕ число. Получить его достаточно просто. При каждом запуске инкрементируйте какую-нибудь ячейку EEPROM и данным значением инициализируйте srand.

да, действительно sm.gif спасибо, что натолкнули на эту мысль, хотя я уже получил аналогичный совет на телесиськах http://530.ru/wwwboards/mcontrol/2979/messages/1182899.shtml

если вдруг кому потребуется действительно случайный генератор чисел, то я нашел целый трактат по этой теме (может, это его посчитали за апноут атмеля?) http://www.avrfreaks.net/index.php?name=PN...pic&t=59417


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ataradov
сообщение Mar 11 2011, 07:55
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



QUOTE (ARV @ Mar 11 2011, 09:53) *
но для одинаковых условий будет неизменным, как мне кажется...
Это кажется, небольшие вариации есть всегда. Но с идиотским новым дизайном на сайте у них теперь ничего невозможно найти.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Mar 11 2011, 08:05
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Согласен с предыдущим оратором.
Хуже того, набор 1 2 3 4 5 6.... тоже является частным случаем случайной последовательности. Которая может быть вполне (если числа действительно случайные).
Посему во многих случаях более полезной будет просто последовательность 1 2 3 4... . Её плюс состоит в том, что числа не повторяются с максимальным интервалом.
И при наличии епром реализуются просто.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 11 2011, 08:07
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(ARV @ Mar 11 2011, 08:42) *
вопрос знатокам: посоветуйте, какими простыми и дешевыми средствами реализовать получение хотя бы одного-единственного, но на самом деле случайного числа в программе?

Уникального серийника нет ? Ну, еще можно воспользоваться тем, что WDT тактируется от RC-генератора, и при основном тактировании от кварца можно измерить время срабатывания WDT и плясать от него. Думаю, достаточно случайное значение, при высокой дискретизации счета.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 11 2011, 08:20
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(rx3apf @ Mar 11 2011, 11:07) *
Уникального серийника нет ? Ну, еще можно воспользоваться тем, что WDT тактируется от RC-генератора, и при основном тактировании от кварца можно измерить время срабатывания WDT и плясать от него. Думаю, достаточно случайное значение, при высокой дискретизации счета.

да, этот метод рассматривался в числе прочих в вышеупомянутом мною трактате sm.gif спасибо, я считаю, что на данном этапе я свою проблему решил.

P.S. на счет 1,2,3,4,5 и т.д. - я вообще молчу (звездавшоке)


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
domowoj
сообщение Mar 11 2011, 15:27
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Если говорить о псевдослучвайной последовательности, то можно прогрмно реализовать
один из вариантов следующей схемы сдвигового регистра с ОС
http://www.qrz.ru/schemes/contribute/secur...generator1.shtm
Или вот так
http://algolist.manual.ru/maths/generator/

Или вот генератор случ. чисел
http://vx.netlux.org/lib/vsl04.html

Сообщение отредактировал domowoj - Mar 11 2011, 15:30


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 11 2011, 15:56
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(domowoj @ Mar 11 2011, 18:27) *
Если говорить о псевдослучвайной последовательности, то можно прогрмно реализовать
.....
Или вот генератор случ. чисел

Что толку с генератора ПСЕВДОслучайной последовательности, если нет возможности рандомизировать "затравку" ? У всех устройств при равном числе обращений к этому генератору "случайное" число будет строго одинаковым...
Go to the top of the page
 
+Quote Post
domowoj
сообщение Mar 11 2011, 17:19
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Тогда усилить шумы стабилитрона
и оцифровать


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
zombi
сообщение Mar 11 2011, 18:51
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(ARV @ Mar 11 2011, 08:42) *
Отправная точка: миниатюрное устройство, где каждый новый компонент - лишний. устройство формирует ряд "случайных" сигналов, используя rand(). в сущности, алгоритм генерации ПСПЧ не принципиален. но есть большая проблема: два одинаковых устройства, включенные одновременно

Интересно как это Вам удается их одновременно включать?
Go to the top of the page
 
+Quote Post
muravei
сообщение Mar 13 2011, 09:53
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(domowoj @ Mar 11 2011, 20:19) *
Тогда усилить шумы стабилитрона
и оцифровать

А если попробовать стабилитрон на уровне опоры компаратора?
Можно тогда обойтись и без ПСП.
Go to the top of the page
 
+Quote Post
SKov
сообщение Mar 13 2011, 09:59
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119



Цитата(muravei @ Mar 13 2011, 12:53) *
А если попробовать стабилитрон на уровне опоры компаратора?
Можно тогда обойтись и без ПСП.

А может, обычный "аналоговый генератор" типа трехточки на одном транзисторе?
И спрашивать напряжение через АЦП?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 13 2011, 10:12
Сообщение #18


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Уважайте поиск! :-)
В ветке AVR по слову RAND куча всего уже понаписано, в том числе и по теме топикстартера:

http://electronix.ru/forum/index.php?act=S...ighlite=%2BRAND

А ведь ещё есть и ветка в помощь начинающему...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
forever_student
сообщение Mar 13 2011, 10:51
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 5-04-09
Из: Москва
Пользователь №: 47 180



Цитата(ARV @ Mar 11 2011, 08:42) *
... посоветуйте, какими простыми и дешевыми средствами реализовать получение хотя бы одного-единственного, но на самом деле случайного числа в программе?...

В такой же ситуации при включении запускал таймер (на МАХ возможной частоте). В момент отпускания кнопки включения таймер считывал. Все.
Go to the top of the page
 
+Quote Post
HALFer
сообщение Mar 14 2011, 01:06
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 21-04-09
Пользователь №: 48 019



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

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

LC-контур СЧ-диапазона на вход ADC тоже даст шум sm.gif все зависит от особенностей конструкции и эксплуатации. мало данных по прибору. чем он включается, одновременно ли два прибора включаются (т е присутствует ли тут фактор человека). больше инфы - больше простора для фантазии
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 14 2011, 05:56
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



не смотря на то, что лично для меня тема исчерпана, обсуждение продолжается sm.gif
поясню:
1. одновременно - не значит на самом деле одновременно, т.е. в абсолютно один и тот же момент. просто человек включает два девайса и они показывают ему одинаковое состояние. человек снова "передергивает" питание - и снова оба одно и то же... причем то же самое, что и в прошлый раз. именно от этого нужно было уйти.
2. самое простое решение было высказано: хранить в EEPROM число включений и использовать его для srand() - инициализации генератора ПСПЧ. это самое простое решение. не смотря на то, что два впервые изготовленных девайса будут вести себя точно так же, как описано в п.1, но стоит на "5 минут" унести один девайс в другую комнату и там его повключать, то вернувшись обратно синхронности уже не добиться. и угадать, на сколько включений произошло рассогласование внутренних счетчиков тоже будет сложно.
3. улучшение варианта п.3 элементрано: на стадии прошивки задается "случайное" первичное значение счетчика включений - это несложно сделать при помощи программатора с возможностью редактирования дампа EEPROM.
4. варианты внешнего усложенения схемы (генераторы шума на стабилитронах, транзисторах и т.п.) дадут лучшую случайность, но, во-первых, истинная случайность не требуется, а во-вторых, это усложняет схему, т.е. удорожает ее. кстати, эти варианты изначально были известны ... и отброшены.
5. кнопок, дребезг которых можно было бы использовать, или останавливать по ним таймер и т.п., в девайсе не предусмотрено sm.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
=AK=
сообщение Mar 14 2011, 06:22
Сообщение #22


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(ARV @ Mar 14 2011, 16:26) *
1. одновременно - не значит на самом деле одновременно


У меня была аналогичная проблема: как по радиоканалу назначить уникальные серийные номера нескольким "свежезапрограммированным" устройствам? Понятно, что программы у них поначалу совершенно одинаковые, и откликаются на вызов одинаково, поэтому вроде бы невозможно их различить.

Чтобы устройства откликались по-разному, я назначаю им временные серийные номера. Причем этот серийный номер назначается не в момент включения, а в момент получения первого (широковещательного) вызова по радиоканалу. А в качестве случайного числа используется значение счетчика локального времени, который считает время от момента включения питания. Соответственно, каждое устройство в момент прихода вызова имеет свое собственное уникальное локальное время, отличное от остальных.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 14 2011, 09:41
Сообщение #23


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(ARV @ Mar 14 2011, 08:56) *
5. кнопок, дребезг которых можно было бы использовать, или останавливать по ним таймер и т.п., в девайсе не предусмотрено sm.gif

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

Цитата(ARV @ Mar 14 2011, 08:56) *
3. улучшение варианта п.3 элементрано: на стадии прошивки задается "случайное" первичное значение счетчика включений - это несложно сделать при помощи программатора с возможностью редактирования дампа EEPROM.

Тогда уж правильнее "сериализация" (инкремент серийного номера) (avreal, например, это обеспечивает). А от серийника считать "затравку".
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 14 2011, 11:17
Сообщение #24


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(rx3apf @ Mar 14 2011, 12:41) *
Еще варианты - измерение напряжения встроенного опорного источника
А относительно чего измерять? Внешний опорник ставить?
Предлагаю считать количество нейтрино, прошедших сквозь прибор, за какой-то интервал времени:-)

Кстати, что там с регистром OSCAL он вообще отличается среди образцов одной партии? Если да то ещё немного случайности добавит.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 14 2011, 11:29
Сообщение #25


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(demiurg_spb @ Mar 14 2011, 14:17) *
А относительно чего измерять? Внешний опорник ставить?

Встроенный опорник относительно питания.

Цитата
Кстати, что там с регистром OSCAL он вообще отличается среди образцов одной партии? Если да то ещё немного случайности добавит.

Тоже варьируется.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 19 2011, 18:24
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



снова у меня проблема sad.gif rand() вместе с srand() не втискиваются в память микроконтроллера. уже несколько дней ищу более-менее адекватную замену - и не могу найти sad.gif

задача очень проста: получить псевдослучайное число в пределах от 1 до 7. все мои попытки сделать генератор ПСПЧ с заданными параметрами дают чрезвычайно короткий цикл - буквально пару десятков чисел, после чего последовательность повторяется sad.gif

я делаю на "регистре сдвига с XOR-обратными связями по простому полиному", после чего маскирую 3 младших бита, и если результат равен 0 - повторяю.

уже сделал открытие, что avr-gcc может с легкостью выбросить volatile register переменные из кода, если моя функция случайного числа объявлена как static... но вот качественной последовательности (мне хватило бы длины цикла хотя бы больше сотни) получить не могу sad.gif то ли полиномы у меня не те, то ли что-то не то в алгоритме...

посодействуйте, пожалуйста...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 19 2011, 21:22
Сообщение #27


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(ARV @ Mar 19 2011, 20:24) *
посодействуйте, пожалуйста...

попробуйте такое, рожал для быстрого шифрования страниц флеш:

Код
#define RND_INITIALIZER (777)

typedef union tagU32xU16
{
    U32 full;
    struct
    {
        U16 low;
        U16 high;
    } words;
} TU32xU16;


U16 cpr_rand16( U16 num)
{
    TU32xU16 t32;
    U16 XorCode = 0xF7B2;

    num += RND_INITIALIZER;

    t32.full = (U32)num * XorCode;
    XorCode ^= t32.words.high;
    t32.full = (U32)t32.words.low * XorCode >> 1;

    return t32.words.low;
}

Input'ом для функции может быть любая последовательность неповторяющихся чисел, например 0, 1, 2, 3 .... 64K.
RND_INITIALIZER задает начальный сдвиг выходной последовательности.

Вот что имеем на выходе для входной последовательности 0, 1, 2, ..255:
Код
rnd initializer 777,  input sequence 0, 1, 2, ... 255:
007d e374 dbb9 6700 5f45 92b4 69c1 1640 ed4d bd14 72e9 40a0 f675 6294 f731 e620
7abd 1cf4 28b9 d140 dd05 1a34 04c1 ce80 b90d 1d7a 623e a76c 1ed8 6406 4522 6918
01bc 25b2 94c6 1c64 5b20 e2be 816a e7d0 47c4 ae2a e92e 2e5c af88 f4b6 cc12 f008
926c b662 69b6 f154 39d0 c16e 565a bcc0 9dbf 93e8 7627 12a8 d3af eb10 ac17 e4f0
84bf bd58 5d27 44d8 484f 2700 2a77 20e0 031f 0308 e547 7808 390f 5a30 1b37 4a50
ea1f 2c78 cc47 7638 662f 3b20 2b17 9660 dac6 255e a7fc f294 d352 fcb2 a088 c9e8
46fe 4f26 1434 1c5c 692a d4fa 4020 abf0 e696 312e bd8c 0824 df22 0882 b618 df78
52ce 5af6 29c4 31ec c2fa 2efc 16a5 1800 ffa9 9bcc 623d 84d0 4b41 83bc 28f5 6cc0
11f9 e6cc 6acd cfd0 53d1 193c 00e5 0c00 f3a9 860c 4c7d 78d0 3f41 6dfc 1335 60c0
05f9 d10c 550d c3d0 48bc 4896 dede 55e0 0ab0 81b2 8912 dedc b4e4 0aae ae66 e2f8
da38 0eca 4eda 6234 7aac 8e06 df8e 5690 1520 8c22 89c2 df8c bf54 151e af16 e3a8
e4a8 193a 4f8a 6488 f3bb a268 319b b780 aa5b ff20 f1fb 5118 22bb 98b8 6a5b 65d0
163b ad70 5ddb f5a8 84db 3d48 cc7b 96a0 897b e800 dadb 3038 01db 8198 533b 44f0
f55b 9650 4918 755c 6ea6 79b2 c854 d360 2e62 8996 6ad0 c604 695e a35a a5cc dfc8
1f7a 383e 5be8 74ac 50b6 4842 8d24 84b0 b3f2 0f26 fa20 5554 eeee 28ea 351c 6f18
a50a c0e4 5581 0f60 a3fd e184 54e9 3000 a365 0704 de11 5f40 364d 3164 e739 89a0
Go to the top of the page
 
+Quote Post
forever_student
сообщение Mar 19 2011, 21:43
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 5-04-09
Из: Москва
Пользователь №: 47 180



Цитата(ARV @ Mar 19 2011, 21:24) *
...посодействуйте, пожалуйста...

У меня для однобайтного псевдослучайного сделано так: Х(n+1)=5*X(n)+5. Х(n) - unsigned char
Go to the top of the page
 
+Quote Post
Warlockwolf
сообщение Mar 19 2011, 21:51
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 17-06-08
Пользователь №: 38 358



Код
u32 iran;
u8 Radom(){
iran=(iran*(u32)4096+(u32)150889)%(u32)714025;
return iran/0xfff;
};


iran -только надо чем то забить первый раз. а потом можно в еппром сохранять.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 20 2011, 09:54
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(forever_student @ Mar 20 2011, 00:43) *
У меня для однобайтного псевдослучайного сделано так: Х(n+1)=5*X(n)+5. Х(n) - unsigned char
не понял - это что за операция? (выделил)

спасибо всем откликнувшимся! но видимо я недостаточно четко изложил нюансы... у меня attiny13, поэтому оперирование 32-битными числами, да еще с умножением и делением - это заведомо неподходящий вариант - так работает стандартный rand() из avr-libc, и при этом в 1К кода моя программа не влезает. мне нужен вариант, требующий не более 200 байт кода.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 20 2011, 12:29
Сообщение #31


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(ARV @ Mar 20 2011, 12:54) *
мне нужен вариант, требующий не более 200 байт кода.

У меня реализация xorshift (32-битный вариант) - 40 слов (80 байтов). asm, и, для экономии, без сохранения регистров (ускоренный вариант и с сохранением - вдвое толще). Нужно ? Избыточно, конечно (для озвученных требований), и не очень эффективная реализация (поскольку алгоритм плохо подходит для 8-битных контроллеров, и не умеющих сдвигать иначе как на один бит),зато просто исключительно хорошее распределение.

Сообщение отредактировал rx3apf - Mar 20 2011, 12:32
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 20 2011, 13:38
Сообщение #32


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(rx3apf @ Mar 20 2011, 15:29) *
У меня реализация xorshift (32-битный вариант) - 40 слов (80 байтов). asm, и, для экономии, без сохранения регистров (ускоренный вариант и с сохранением - вдвое толще). Нужно ? Избыточно, конечно (для озвученных требований), и не очень эффективная реализация (поскольку алгоритм плохо подходит для 8-битных контроллеров, и не умеющих сдвигать иначе как на один бит),зато просто исключительно хорошее распределение.
по идее xor-shift довольно прост, все дело в "полиноме", не так ли? у меня сейчас так:
Код
static uint16_t prev_rand;
uint8_t rand(void){
   if(prev_rand & 1)
      prev_rand = (prev_rand >> 1) ^ POLYNOM;
   else
      prev_rand >>= 1;
   return prev_rand & 7; // мне нужно число от 0 до 7 (точнее, 0 не нужно, но это мелочи)
}
думаю, ваш вариант аналогичный, разве что не 16, а 32 бита "регистр". все упирается именно в POLYNOM... который я так и не смог подобрать...

или я что-то не так делаю?

так как я по сути использую только младшие 3 бита, меня интересует распределение именно этой части - все мои попытки дают крайне короткую последовательнсоть ИМЕННО этих битов... скажите мне свой полином - я протестирую, может. ваш вариант будет лучше...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 20 2011, 14:05
Сообщение #33


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(ARV @ Mar 20 2011, 16:38) *
скажите мне свой полином - я протестирую, может. ваш вариант будет лучше...

xorshift реализуется не так, как большинство простых алгоритмов реализации ПСП (обратная связь по нескольким "отводам" из регистра сдвига - полиномы для которых можно посмотреть, например, у Хоровица и Хилла), там сдвиг всего содержимого и xor всего этого добра.
CODE
;----------------------------------------------------------------------
; Генератор псевдослучайных чисел (алгоритм XorShift32)
; Используются и не сохраняются регистры r2...r9, Z и temp
;----------------------------------------------------------------------

XorShift32:
ldi ZH,high(Rnd32)
ldi ZL,low(Rnd32)
ldd r5,Z+0
ldd r4,Z+1
ldd r3,Z+2
ldd r2,Z+3
movw r9:r8,r5:r4
movw r7:r6,r3:r2
ldi temp,5
XS32_1:
lsl r6
rol r7
rol r8
dec temp
brne XS32_1
eor r5,r8
eor r4,r7
eor r3,r6

movw r7:r6,r5:r4 ; сдвиг вправо на 16
lsr r7
ror r6 ; и еще на 1
eor r3,r7
eor r2,r6

movw r9:r8,r5:r4
movw r7:r6,r3:r2 ; копия регистра
ldi temp,5
XS32_2:
lsl r6
rol r7
rol r8
rol r9
dec temp
brne XS32_2

eor r5,r9
eor r4,r8
eor r3,r7
eor r2,r6

std Z+0,r5
std Z+1,r4
std Z+2,r3
std Z+3,r2
ret
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 20 2011, 14:53
Сообщение #34


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(ARV @ Mar 20 2011, 11:54) *
требующий не более 200 байт кода.

Тогда как насчет таблички. Если вам нужны только 3-х битные числа, то в 200 байт можно засунить последовательность из ~500 чисел. ну а затем просто последовательно их читать.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 21 2011, 09:07
Сообщение #35


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



всем в очередной раз спасибо. как обычно, в попытках объяснить свою проблему другим сам начинаешь понимать, в чем причина и решение находится sm.gif

моя проблема была в том, что я не учел, что вышеприведенный мной код генерирует при каждом обращении ТОЛЬКО 1 СЛУЧАЙНЫЙ БИТ, а я использовал сразу три бита из "регистра"... сейчас я улучшил генератор ПСП, как мне кажется, до приемлемого уровня случайности, путем заполнения выходного числа тремя случайными битами.

в очередной раз проблема, похоже, решена sm.gif раньше, например, всегда после числа 7 можно было ожидать число 3, причем однозначно, сейчас же с более менее равной вероятностью приходят другие числа.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 2 2012, 13:34
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



а не лучше ли использовать алгоритм ПСП, например ГОСТ, просто записывать последнее значение во флеш, и при запуске снова контроллера, брать последнее значение от туда, а не заново начинать считать?
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 18:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01751 секунд с 7
ELECTRONIX ©2004-2016