对于由数组索引标识的某些动作,我有一个概率数组(例如 Boltzmann 分布)
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)...。您是否看到错误或错误可能出现在另一个代码点中?谢谢