Предполагая, что веса элементов фиксированы, вы можете работать с предварительно вычисленными суммами.Это похоже на работу с кумулятивной функцией вероятности напрямую, а не с функцией плотности.
Поиск может быть реализован в виде двоичного поиска и, следовательно, может быть log (N) по числу элементов.
Бинарный поиск, очевидно, требует random_access для контейнера весов.
В качестве альтернативы, используйте std::map<>
и upper_bound()
метод.
#include <iostream>
#include <map>
#include <stdlib.h>
int main ()
{
std::map<double, char> cumulative;
typedef std::map<double, char>::iterator It;
cumulative[.20]='a';
cumulative[.30]='b';
cumulative[.40]='c';
cumulative[.80]='d';
cumulative[1.00]='e';
const int numTests = 10;
for(int i = 0;
i != numTests;
++i)
{
double linear = rand()*1.0/RAND_MAX;
std::cout << linear << "\t" << cumulative.upper_bound(linear)->second << std::endl;
}
return 0;
}