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

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

    解法:设置一个整形num,用来存放get()返回的数。调用getNum()V[N]取数,按一定概率存入num中(覆盖以前的),直到getNum()返回NULL。getNum取的第i个数为numinumi存入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;
    }
  • 相关阅读:
    splunk linux安装
    [读书笔记]-时间管理-把时间当做朋友
    [读书笔记]-技术学习-Redis
    [读书笔记]-阅读方法-王者速读法
    vuex、localStorage、sessionStorage之间的区别
    vuex的使用
    Vue常用指令总结
    vue-router参数传递
    Vue-router的基本使用
    v-on精炼
  • 原文地址:https://www.cnblogs.com/pangblog/p/3315360.html
Copyright © 2011-2022 走看看