Дизайн & математика

Задачка:
Есть n объектов, которые нужно рандомно разбросать по карте, но - одни объекты должны появляться чаще, а другие реже. Иными словами это как сделать заданное неравномерное распределение :)

Решим что для всех n объектов есть некий коэффициент частоты:
double kk[8]={1,1,0.5,2,2,0.3,0.9};
Причем сами цифры (их абсолютная величина) - не играет роли, нам важна их относительная величина (относительно к другим).

Подсчитаем общий вес: double k_s = sum_double(kk,8);
Он равен = 7.7 :) Хорошее число между прочим получилось.

Затем подсчитаем .... назовем пределам значимости, быть может для этого есть другое более умное название, но я его не знаю.

double kp[9];
double a=0;
for(int i=0;kk[i];i++)
{
a += kk[i];
kp[i] = a;
}

Затем начнем распределение :)

srand(time(0));
map<int,int> maps;
for(int j=0;j<sm;j++)
{
int r=rand()%( int(k_s*10.0));
int select;
for(int i=0;kk[i];i++)
if (kp[i]> double(r)/10.0)
{
select = i;
break;
}
if (maps.find(select)==maps.end())
maps[select] =1;
else
maps[select] = maps[select]+1;
}

Тут конечно чуток STL, но это только для простоты подсчета - чтобы вам показать результат. Да и использование double только из-за того, что мне удобнее представлять доли в дробях, а кто-то легко обойдется целыми числами.

И вывод:

int k=0;
for(map<int,int>::iterator i=maps.begin();i!=maps.end();i++,k++)
{
printf("%d - %d [%.2f]n",i->first,i->second,kk[k]);
}

0 - 49 [1.00]
1 - 52 [1.00]
2 - 26 [0.50]
3 - 107 [2.00]
4 - 101 [2.00]
5 - 11 [0.30]
6 - 54 [0.90]

По-моему красота :)

А все это для того, чтобы равномерно разместить новые атрибуты в игре, которые нарисовал наш арт-директор ;)