算法导论笔记:05随机问题

4:用RANDOM(0,1)实现RANDOM(ab)

       这道题的实现思路:这个题目相当于在能随机生成 0, 1 的前提下,要求随机生成 n=b-a+1 个整数。      

       1、把要生成的数标记为 a, a+1, a+2,..., b-a+1,…,b-1,b      

       2取最小的 m,使得2^m >= n       

       3、通过随机生成 0,1 的函数生成一个   m 比特整数(随机生成每一位),这样能随机生成[0, 2^m)内的整数。      

       4、随机生成一个 [0,2^m) 中的整数,如果这个数加a大小在 [a, b] 内,则取这个数为结果。如果这个数加a在 [a, b] 外,则丢弃它,重新生成一个。

 

int getBit(int a,int b)             

{                                    

       int n = b - a + 1;      //n表示个数         

       int bit = 0;                     

       int value = 1;        //value = 2^bit           

                                      

       while (value < n)                

       {                                

              bit++;                       

              value = value << 1;          

       }                                

                                     

       return bit;                      

}                                    

                                      

int random_a_b(inta, int b)         

{                                    

       int bit = getBit(a, b);          

                                     

       int flag;                        

       int result = 0;                  

       while (true)                     

       {                                

              for (int i = 0; i < bit; i++)

              {                            

                     flag = random_0_1();     

                     flag = flag << i;        

                     result |= flag;          

              }                            

                                     

              if (result + a > b)          

              {                            

                     result = 0;              

                     continue;                

              }                            

              else                         

                     break;                   

       }                                

                                     

       return result + a;               

}         

 

       5random(0,1)以概率p返回0,以概率(1-p)返回1。基于它实现random2(0,1),各以1/2的概率返回01.

while(true)
{
       x=random(0, 1);
       y=random(0, 1);
       if(x != y)
       return x;
}

       该算法,只有在(x,y) = (1,0)或者(0,1)的情况下,才会返回,返回值为第一个数,因为用random(0,1)生成(1,0)或者(0,1) 的概率为p(1-p),两者生成的概率是相同的,所以,返回1和返回0的概率分别为1/2。第一题类似的原理,函数内部,用random(0,1)生成[0,b-a+1]中每个数的概率都是1/ 。所以,生成[0,b-a+1]中每个数的概率是相同的,因而返回每一个数的概率也是相同的。

 

posted @ 2015-04-19 17:34  gqtc  阅读(131)  评论(0编辑  收藏  举报