条件概率:事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为P(A|B)=P(AB)/P(B)。
随机数:面试题中一般假设有了一个随机生成器,自然数n%M是“均匀”的,且具有一定的随机性,但是密码学中一般不采用,因为其是可预测的。
关于独立:用定义来证明,P(AB)=P(A)*P(B)
【例题1】:假设一个随机数发生器rand7均匀产生1到7之间的随机整数,如何构造rand10,均匀产生1-10之间的随机整数?
【分析】:关键在于,扔掉不想要的数,同时要保证“等概率”,必须保证“均匀”,才能扔掉,比如:rand2()+rand2()-1并不是均匀的1-3,范围是一致的,1和3的概率是0.25,2的概率是0.5。
【法1】:(较差方法)1-7之间有三个偶数,四个奇数,扔掉一个奇数,那么这三个偶数和三个奇数之间是同等概率产生,可构成一个0-1整数的均匀产生器。用它产生四个bit(二进制),对应整数为0-15,然后保留1-10即可。
【法2】:(较好方法)使用七进制:首先把1-7减去1,变成0-6。产生一个两位的七进制数,对应0-48,把40-48扔掉(因为这只有9个数),其余安装个位数字分类,0-9对应我们要的1-10.
【例题2】一个随机发生器,不均匀,以概率p产生0,以(1-p)产生1,(0<p<1),构造一个均匀的随机发生器(算法导论)
【分析】产生两次,(0,1)的概率和(1,0)的概率都相同,为p*(1-p)。
【例题3】水库采样流入若干个对象(整数),事先不知道个数,如何随机取出k个(k小于总数)?
【分析】用一个数值a保存k个数a[0...k-1],对于第i个元素,若i<=k;则a[i-1]存放这个元素,否则:产生随机数x=rand()%i,这里若x<k,则用a[x]存放这个元素,替换掉之前的元素。
【扩展】 - k=1的特殊性 -一个若干行大文件,随机选择一行(产生随机数) -一个不知道长度的链表,随机选择一个或多个元素 -带权采样 -
【例题4】给定n种元素,在给定n个权值,按权值比例随机抽样一个元素,假设权值都是整数。
【法1】复制若干份,每个元素复制权值那么多份,用例5的方法水库采用,例:3个a,2个b,6个c,变为aaa,bb,ccccccc。优点是可以使用已有的方法,缺点是需要自己复制。
【法2】每个元素按照权值对于一个区间,同上,a对于[0-2],b对应[3-4],c对应[5-10],随机产生一个[0-10]的随机数,二分查找最后对应的元素是哪个。优点:省空间,缺点:需要二分查找。
【法3】假设有m种元素,(1)先按1/m的概率随机选择一种元素,(2)再产生随机数根据权值决定能否选择这种元素,若能选取它并结束,否则返回(1)。 关于第(2)步的概率,Pi = a/b - 产生随机数%b,看是否小于a -或者产生[1...b]的随机数,看是否小于等于a -或者产生[0...b-1]的随机数,看是否小于a
【参考】:http://www.julyedu.com/video/play/id/35