存在具有有限状态的给定分布p,并且分布是p = {p_1,p_2,...,p_n}。每个p_i表示状态i发生的概率。
根据这种分布,我倾向于采样,或者预测下一个状态将是什么。据我所知,这个问题可以通过轮盘方法实现。轮盘赌方法的代码如下:
int Sample(int * p, int n){
for(int i = 1; i < n; i++){
p[i] += p[i - 1];//Accumulate probability
}
double ran_val = (double) rand() / RAND_MAX;//Generate random number between [0,1]
int index = 0;
for(; index < n; index++){
if(ran_val < p[index]){
break;
}
}
return index;
}
我们首先累加从第二行到最后一行的概率,然后在[0,1]之间随机加一个val(我们假设$ \ sum {p_i} = 1 $)。在下一步中,我们检查val落入哪个区间,并返回相应的区间索引(或状态编号)。
例如,对于4个状态1,2,3,4,给定分布为{0.1,0.2,0.3,0.4}。累积后,它达到{ 0.1 ,0.1 + 0.2 = 0.3 ,0.3 + 0.3 = 0.6 ,0.6 + 0.4 = 1.0 }。一旦我们随机一个val,比如0.5。程序将检查间隔[0,0.1],然后检查[0.1,0.3)和[0.3,0.6]等等,以确定将落入哪个val。在这种情况下,状态3将是答案。
据我所知,这种方法是最好的实施策略。上面的代码实现了数组p的两个循环遍历(当然它只能在一轮内简化)。但是,有没有其他方法可以完成比上述更好的随机样本任务,可能更少的时间复杂度或更多的可解释性?如果您有想法,可以提供一些参考或链接吗?