Цитата(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.