0

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

4

0 回答 0