|
Простой ГСП на Си |
|
|
|
 |
Ответов
|
Jan 17 2014, 22:04
|

Гуру
     
Группа: Модераторы
Сообщений: 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; }
|
|
|
|
|
Jan 18 2014, 07:38
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|