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

 
 
> Простой ГСП на Си
Herz
сообщение Jan 17 2014, 19:13
Сообщение #1


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Предположим, требуется моргать светодиодом с псевдослучайным интервалом от 2 до 30 секунд.
Посоветуйте простую функцию на Си для генерации целых чисел в таком малом диапазоне. Пусть от 1 до 255 максимум.
Функция rand() из библиотеки HT-PICC тяжеловата как-то...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Herz
сообщение Jan 17 2014, 22:04
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Спасибо, SM!
Но, по правде говоря, ничего не понял.
Вас на затруднит немного разжевать?
Вот если у меня есть две переменные:
Код
unsigned char min = 2;
unsigned char max = 30;


и я вызываю функцию

unsigned char rand(a, b ) :

result = rand(min, max);

желая получить число в указанном диапазоне. Как должно выглядеть её тело?
Так?
Код
unsigned char rand(a, b)
{
static unsigned int rand_value
return (unsigned char)((rand_value) % b) + a;
}
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 18 2014, 07:38
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Herz @ Jan 18 2014, 02:04) *
Вас на затруднит немного разжевать?

желая получить число в указанном диапазоне. Как должно выглядеть её тело?




Если за базу взять ф-цию, предложенную TSerg, то вот так:

медленный код (он притащит библиотечную ф-цию деления с остатком):

суть - тупое вычисление в лоб остатка от деления ограничиваемого числа на max.

Код
u8 rnd8(u8 max, u8 offset)
{
static u16 seed = 0;
u8 temp;

seed = (seed << 7) - seed + 251;

temp =  (u8)(seed + (seed>>8));

return (temp % max) + offset;

}


самый быстрый код, но требующий маски, которая задается параметром ф-ции, и должна быть числом 2^n-1, ближайшим, больше либо равным "max".

Суть кода - операция лог. И с маской, соответствующей требованию ближайшего, большего либо равного 2^n-1, к max, ограничивает значение неким числом 2^n-1, меньшим max*2, затем в одну итерацию вычитания по условию, число ограничивается уже max.

Если требуется вычисление маски во время выполнения, то есть "max" задается не константами, и требуется максимальная скорость, то можно добавить получение маски по таблице (массиву констант на 256 значений - тут уж хотите быстро, раскошеливайтесь на память для таблиц, другие способы вычисления такой маски на АВР в любом случае будут в цикле до 8 итераций в худшем случае)...


Код
u8 rnd8(u8 mask, u8 max, u8 offset)
{
static u16 seed = 0;
u8 temp;

seed = (seed << 7) - seed + 251;

temp =  ((u8)(seed + (seed>>8))) & mask;
if (temp >= max) temp -= max;

return temp + offset;

}



вот еще вариант, с операцией вычисления остатка от деления, реализованной в теле ф-ции без использования библиотечных ф-ций, средне производительный.

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


Код
u8 rnd8(u8 max, u8 offset)
{
static u16 seed = 0;

u8 temp, i;
u16 sub;

seed = (seed << 7) - seed + 251;

temp =  (u8)(seed + (seed>>8));

i=8; sub = max << 8;

do {
  sub >>= 1;
  if (sub >= temp) temp -= sub;
} while (--i);

return temp + offset;

}




Цитата(_Pasha @ Jan 18 2014, 11:30) *
для данного случая это будет всегда выигрышнее, чем целочисленное деление


Да щасссс... целочисленное деление всегда 8 итераций (см. мой третий вариант). А у вас.... прикиньте, например, для частного случая max = 3 и tmp=254.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 18 2014, 08:05
Сообщение #4


;
******

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



Цитата(SM @ Jan 18 2014, 11:38) *
Да щасссс... целочисленное деление всегда 8 итераций (см. мой третий вариант). А у вас.... прикиньте, например, для частного случая max = 3 и tmp=254.

А ну да, маску надо задавать.
Ага, и нафига там min в параметрах? Для красоты sm.gif


Сообщение отредактировал _Pasha - Jan 18 2014, 08:06
Go to the top of the page
 
+Quote Post
Herz
сообщение Jan 18 2014, 08:54
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Спасибо большое, есть что покурить.

Цитата(_Pasha @ Jan 18 2014, 10:05) *
Ага, и нафига там min в параметрах? Для красоты sm.gif

Ну, это пустяки. Если функция возвращает число в диапазоне от 0, то можно предварительно max задать уменьшенным на min, а потом к результату этот min добавить, как у Вас.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Herz   Простой ГСП на Си   Jan 17 2014, 19:13
- - thermit   x(n)=(1664525*x(n-1)+32767) mod 2^32 и берем старш...   Jan 17 2014, 19:21
- - TSerg   Любой RNG на основе сдвигового регистра 8 р, но лу...   Jan 17 2014, 19:28
|- - Herz   Спасибо, коллеги за скорую помощь! Цитата(...   Jan 17 2014, 19:50
|- - aaarrr   Цитата(Herz @ Jan 17 2014, 23:50) Я тольк...   Jan 17 2014, 19:52
|- - Herz   Цитата(aaarrr @ Jan 17 2014, 21:52) Она н...   Jan 17 2014, 20:04
- - SM   интервал определен как [offset, offset+max) два в...   Jan 17 2014, 20:49
|- - _Pasha   Цитата(Herz @ Jan 18 2014, 12:54) Ну, это...   Jan 18 2014, 09:02
|- - SM   Цитата(_Pasha @ Jan 18 2014, 13:02) что m...   Jan 18 2014, 09:07
|- - Herz   Цитата(_Pasha @ Jan 18 2014, 11:02) Ага, ...   Jan 18 2014, 09:16
- - _Pasha   Кодu8 rnd8(u8 min, u8 max) { static u16...   Jan 18 2014, 07:30
- - Herz   Странно, но вот у меня такая функция: Кодunsigned...   Jan 18 2014, 10:55
- - SM   Я допустил описку, сорри... Писал прямо в форум......   Jan 18 2014, 11:07
- - Herz   Семён Семёныч! Да, теперь работает отлично....   Jan 18 2014, 11:13
|- - SM   Цитата(Herz @ Jan 18 2014, 15:13) Кстати,...   Jan 18 2014, 11:16
|- - Herz   Цитата(SM @ Jan 18 2014, 13:16) По ANSI э...   Jan 18 2014, 11:22
|- - SM   Цитата(Herz @ Jan 18 2014, 15:22) Нет, я ...   Jan 18 2014, 11:30
- - Herz   ОК, я понял. То есть и у TSerg смысла в явном при...   Jan 18 2014, 11:40
|- - SM   Цитата(Herz @ Jan 18 2014, 15:40) То есть...   Jan 18 2014, 11:42
|- - Fat Robot   Не нужно вам никакого деления и остатка от деления...   Jan 18 2014, 14:15
|- - SM   Цитата(Fat Robot @ Jan 18 2014, 18:15) од...   Jan 18 2014, 20:42
- - Victor®   Цитата(Herz @ Jan 17 2014, 23:13) Предпол...   Jan 18 2014, 21:12
- - Herz   Цитата(Fat Robot @ Jan 18 2014, 16:15) Не...   Jan 18 2014, 22:16
|- - Fat Robot   Объясню предельно просто, не жонглируя терминологи...   Jan 18 2014, 23:55
|- - Tanya   Цитата(Fat Robot @ Jan 19 2014, 03:55) то...   Jan 19 2014, 08:05
- - Herz   Благодарю Вас, теперь ясно.   Jan 19 2014, 06:58
- - TSerg   Использование чисто арифметических методов приведе...   Jan 19 2014, 13:24
|- - SM   Цитата(TSerg @ Jan 19 2014, 17:24) Вместо...   Jan 19 2014, 14:40
||- - TSerg   Цитата(SM @ Jan 19 2014, 18:40) мои глюки...   Jan 19 2014, 15:51
|- - Herz   Цитата(TSerg @ Jan 19 2014, 15:24) Исполь...   Jan 19 2014, 22:06
||- - SM   Цитата(Herz @ Jan 20 2014, 02:06) Мне каж...   Jan 20 2014, 08:24
|- - Herz   Цитата(TSerg @ Jan 19 2014, 15:24) Лучше ...   Jan 20 2014, 13:01
- - TSerg   Сильно извиняюсь.. слегка забегаю в Инет, принимая...   Jan 20 2014, 13:23
|- - Herz   Цитата(TSerg @ Jan 20 2014, 15:23) Сильно...   Jan 20 2014, 13:25
|- - Tanya   Цитата(Herz @ Jan 20 2014, 17:25) А поче...   Jan 20 2014, 13:32
|- - Herz   Цитата(Tanya @ Jan 20 2014, 15:32) А поче...   Jan 20 2014, 13:40
|- - Tanya   Цитата(Herz @ Jan 20 2014, 17:40) МК уже ...   Jan 20 2014, 13:48
|- - Herz   Цитата(Tanya @ Jan 20 2014, 15:48) И лишн...   Jan 20 2014, 17:12
- - TSerg   Спасибо за поздравление, Herz! Однако нам не ...   Jan 20 2014, 20:14
- - SM   Кстати, на сколько я помню, для любого линейно-кон...   Jan 20 2014, 20:42
- - TSerg   Ну, так я и без претензий - просто сделал попытку ...   Jan 20 2014, 20:53
- - SM   Да и я без претензий... просто сделал попытку мате...   Jan 20 2014, 20:55
|- - TSerg   Цитата(SM @ Jan 21 2014, 00:55) Вот у M-п...   Jan 20 2014, 21:04
- - Herz   Цитата(TSerg @ Jan 20 2014, 22:14) Поэтом...   Jan 21 2014, 07:12
- - TSerg   ЦитатаОчень Вам признателен. Да не за, что - гости...   Jan 21 2014, 07:41
- - ARV   для задач типа случайного мигания светодиодом, т.е...   Jan 22 2014, 06:04


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 07:44
Рейтинг@Mail.ru


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