您的位置:首页 > 其它

写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N平均分布的

2013-09-11 19:46 435 查看
题目:有一个函数int getNum(),每运行一次可以从一个数组V
里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V
里随机取出一个数,而这个数必须是符合1/N平均分布的,也就是说V
里面任意一个数都有1/N的机会被取出,要求空间复杂度为O(1)。

解法:设置一个整形num,用来存放get()返回的数。调用getNum()从V
取数,按一定概率存入num中(覆盖以前的),直到getNum()返回NULL。设getNum取的第i个数为numi,numi存入num中的概率为Pi。设Pi=1/i ( i已知时,所以这个概率很容易做到)。则numi保留,并最后返回的情况是,numi被存入num中,且numj(i<j<=N)不被存入num。其概率为:P(numi)=Pi*(1- Pi+1) * (1 - Pi+2)* ...(1 - PN)=1/i * (i/(i+1)) * ((i+1)/(i+20)*....((N-1)/N) = 1/N。

int GetRand()
{
int i=1;
int nRet = 0;
int nVal = 0;
while((nRet=getNum())!=NULL)
{
if(rand()%(i++)==0) nVal = nRet;
}
return nVal;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐