首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

随机从长度未知的数组中抽取数目字,且保证每个元素被抽到的概率相同

2013-10-22 
随机从长度未知的数组中抽取数字,且保证每个元素被抽到的概率相同一、题目简介这个题目出自一道面试题,题目

随机从长度未知的数组中抽取数字,且保证每个元素被抽到的概率相同

一、题目简介

    这个题目出自一道面试题,题目描述如下:

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

    此题思路如下:

    设置一个整形nVal,用来存放get()返回的数。调用getNum()从V[N]取数,按一定概率存入nVal中(覆盖以前的),直到getNum()返回NULL。设getNum取的第i个数为nVali,nVali存入nVal中的概率为Pi。设Pi=1/i ( i已知时,所以这个概率很容易做到)。则nVali保留,并最后返回的情况是,nVali被存入num中,且nValj(i<j<=N)不被存入nVal。其概率为

P(nVali)=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;}

热点排行