c ++ случайное число с заданным массивом вероятностей

У меня есть массив вероятности для некоторых действий, идентифицированных индексом массива (например, как распределение Больцмана)

for(int i=0;i<N_ACTIONS;i++)
{
p[i]=exp(q_tab[state()][i]/T);

if(isnan(p[i]))
{
p[i]=0;
}

}
long double s=p.sum();
for(int i=0;i<N_ACTIONS;i++)
{
p[i]=p[i]/s;
}

Я должен выбрать случайное число i между 0 и N_ACTIONS-1 с вероятностью p [i]; Я сделал это, но, похоже, не работает хорошо:

int ChoiceFromDist(valarray<long double> p)
{
int                   index=0;
valarray<long double> cumulativa(p.size());

cumulativa[0]=p[0];

for(int i=1; i < p.size(); i++)
cumulativa[i]  =  cumulativa[i-1]+p[i];

long double num= ( (long double)rand()/(long double)RAND_MAX );

while(index<p.size() && cumulativa[index]<num )
index++;
return index;
}

вызывающий:

srand(time(0));
act=ChoiceFromDist(p);

Кажется, выбор всегда один и тот же номер (от 0 до 2, выбор 2) …. Видите ли вы что-то не так или ошибка в другой кодовой точке?
Спасибо

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]