转载 点击打开链接
//代码实现
dbTemp=rnd(0.0,dbTotal); //取一个随机数
for (int i=0;i<N_CITY_COUNT;i++)
{
if (m_nAllowedCity[i] == 1) //城市没去过
{
dbTemp=dbTemp-prob[i]; //这个操作相当于转动轮盘
if (dbTemp < 0.0) //轮盘停止转动,记下城市编号,直接跳出循环
{
nSelectedCity=i;
break;
}
}
}
这种算法是将随机产生的值dbTemp依次对每个城市被选中的概率做减法,减到第i个城市即相当于上述网页中提到的随机值处在第i-1个城市和第i个城市之间。假设随机值得产生是没有任何规律的,那么被选中概率大的城市,即该城市与上一个城市之间的累积和也较大,被命中的概率也较大。简而言之,这个选择过程就相当于转一个有刻度的轮盘,虽然是随机的,但是也考虑到每一块命中的概率问题。