Я новичок в C ++, поэтому я заранее извиняюсь за небрежное программирование. У меня есть вектор вероятностей и еще один из xvalues. Что мне нужно сделать, чтобы накапливать вероятности, чтобы получить гистограмму с растущим числом, а затем сгенерировать случайное равномерное число и найти положение, в котором оно падает в xvales (ind в функции исторических функций Matlab — [bincounts, ind] = histc ( ___) -). В конце концов мне нужно сделать это для вектора случайных чисел, но я подумал, что нужно пометить звездой только одно число. Это то, что я до сих пор:
int main() {
double nale=0;
nale = rand_uniforme_1(0,1); // function that creates a uniform random nunber (it works already)
double vx[] = {2,4,6,8};
std::vector<double> valorx(vx, vx+4);
double vp[]={0.2,0.3,0.1,0.4};
std::vector<double> probab(vp, vp+4);
// acumulate
std::vector<double> proacum1(probab.size());
std::partial_sum (probab.begin(), probab.end(), proacum1);
// add a 0 at the beggining
std::vector<double> proacum(probab.size()+1);
proacum[0]=0;
for (int i = 0; i < proacum1.size(); ++i) {
proacum[i+1]=proacum1[i];
}
// position of the uniform random number
std::vector<double>::iterator low;
low=std::lower_bound (proacum.begin(), proacum.end(), nale);
int pos=(low- proacum.begin());double value=valorx[pos];
std::cout << nale << "\n";
std::cout << value << "\n";
}
Это дает мне ошибки:
-error: no viable overloaded '=' in low=std::lower_bound (proacum.begin(), proacum.end(), nale);
-n instantiation of function template
specialization 'std::__1::partial_sum<std::__1::__wrap_iter<double *>,
std::__1::vector<double, std::__1::allocator<double> > >' requested here
std::partial_sum (probab.begin(), probab.end(), proacum1);
и больше того, чего я даже не понимаю.
int pos=(low- proacum.begin());
Разыщите это. Вы назначаете итератор для int.
Я не могу проверить это, потому что у меня нет всех используемых библиотек и объявлений функций, но я верю
int pos = *(low - proacum.begin)
Должно работать просто отлично.
Других решений пока нет …