《算法导论》之 Problem 5.1-3(随机函数发生器的设计)

问题叙述:

*5.1-3  假设你希望以各1/2的概率输出0和1.你可以自由使用一个输出0或1的过程BIASED-RANDOM。它以概率p输出1,以概率1 - p输出0,其中 0 < p < 1,但是你并不知道p的值。给出一个利用BIASED-RANDOM作为子程序的算法,返回一个无偏向的结果,即以概率1/2返回0,以概率1/2返回1。作为p的函数,你的算法的期望运行时间是多少?

 

算法分析:

    已知BIASED-RANDOM可产生0和1,那么 1 - BIASED-RANDOM也产生1和0,且以1 - p的概率输出1,以p的概率输出0。

      如果我们将1 - BIASED-RANDOM看做另外一个函数发生器,和BIASED-RANDOM组合成对被调用,有以下结论:

      调用结果    00      01     10    11

      1的个数     0        1      1     2

      出现概率    (1-p)*(1-p)  (1-p)*(1-p)  p*p  p*(1-p)

    那么,进行一次调用,出现1的个数的期望值为: 0 * (1-p)*(1-p) + 1 * (1-p)*(1-p) + 1 * p*p + 2 * p*(1-p) = 1。进行4次成对调用,则1的期望个数为4。为什么要调用4次呢?因为BIASED-RANDOM产生0的概率和 1 - BIASED-RANDOM产生1的概率相等;BIASED-RANDOM产生1的概率和 1 - BIASED-RANDOM产生0的概率相等,那么4次刚好覆盖了所有组合对(00,01,10,11),也可进行8次,16次等调用。当进行4次成对调用后,统计1出现的个数,若小于4次,则返回0;大于4次,则返回1(这里相当于将4次调用封装为了一个函数)。但有个问题,等于4次该返回0还是1呢?(因为1的可能次数为0至8)所以,可进行大量成对调用,以使单个现象可被忽略。如,进行1024次调用,统计1的个数,小于1024返回0,否则返回1。


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页