У меня есть массив вероятности для некоторых действий, идентифицированных индексом массива (например, как распределение Больцмана)
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) …. Видите ли вы что-то не так или ошибка в другой кодовой точке?
Спасибо
Задача ещё не решена.
Других решений пока нет …