现在的位置: 首页 > 综合 > 正文

算法导论 5.1-2

2013年02月09日 ⁄ 综合 ⁄ 共 1295字 ⁄ 字号 评论关闭
:描述random(a, b)过程的一种实现,它只调用random(0,1)。作为a和b的函数,你的程序期望运行时间是多少?

Randomab)需满足的条件:

1ab之间的元素是等概率出现的

2)其概率=1/(b-a+1)

以下解题思路仅实现了---等概率出现,至于得到的概率<=1/(b-a+1)

解析:1·Random(0,1)可以等概率产生01,如果将(b-a+1)写成二进制形式,则可以用Random(0,1)产生的值(01)串起来表示(b-a+1),执行Random(0,1)
p
次后,得到的结果将是Random(0, 2^p),当2^p >= (b-a+1)时,实际上0~(b-a+1)【准确的说是0~2^p】之间的元素已经可以等概率出现了

2·分治法:

2.1分解,将a-b区间分成2部分,通过random(0,1)控制,则进入前半部和后半部的概率是一样的;

2.2.递归的处理前后两个部分,若问题足够小,即落到某个具体位置上时,则直接返回;

注意:当元素个数(b-a+1)不是2的幂次时,直接进行分治得不到等概率

元素;此时需要添加(b+1)(b+2)(b+3)···以使得元素个数等于2的幂次,然后再对a~(b+i)进行分治

  1. #include <iostream>  
  2. #include <cstdlib>  
  3. #include <time.h>  
  4. using namespace std;  
  5.   
  6. int random(int a , int b)  
  7. {
     
  8.     int p,m=1;               //m用来保存2^p  
  9.     for(p=0 ; m<b-a+1; p++) //p是二进制位数 
    ,b - a + 1 至少要p位二进制才能存下。
  10.     {  
  11.         m *= 2;              //再用m保存十进制的值  
  12.     }  
  13.   
  14.     m = rand()%2;  
  15.   
  16.     for(int i=0 ; i<p; i++)  
  17.     {  
  18.         m = m*2+rand()%2;//将生成的01串表示成十进制,注意每次都要左移,所以m*2  
  19.     }  
  20.   
  21.     if(m > b-a)  
  22.     {  
  23.         return random(a , b);  
  24.     }  
  25.     else  
  26.     {  
  27.         return m+a;  
  28.     }  
  29. }  
  30. int main()  
  31. {  
  32.     int a,b;  
  33.     cin >> a >>b;//输入3和7  
  34.     srand(time (0) );  
  35.     int m;  
  36.     int three , four , five ,  
  37.         six , seven;//这几个变量用来统计3,4,5,6,7出现次数  
  38.     three = four = five =  
  39.         six = seven=0;  
  40.     for(int i=0 ; i<1000 ; i++)  
  41.     {  

抱歉!评论已关闭.