源地址:http://buptdtt.blog.51cto.com/2369962/676880 

 

算法导论的5.1-2题。RANDOM(a,b)将返回一个介于a与b之间的整数,且每个整数出现的机会相等。可调用RANDOM(0,1)。RANDOM(0,1)产生0和1的概率都为0.5。书中没有给RANDOM(0,1)的实现程序,为了便于调程序,我自己写了个random函数来代替RANDOM(0,1),不知道对不对啦。

        这道题的实现思路:

       这个题目相当于在能随机生成 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] 外,则丢弃它,重新生成一个。

        程序1

        生成10个1到6之间的数字

 
  
  1. #include   "iostream.h "   
  2. #include   <time.h>   
  3. #include <math.h>  
  4. #include   <stdlib.h>   
  5. #include <iostream>  
  6. using namespace std;  
  7.  
  8. int   random()  //不知道对不对   等概率产生0和1  
  9. {   
  10.     int   a;   
  11.     a=rand()%2;         //rand()%2为随机产生一个0或1,   
  12.     return a;   
  13. }  
  14. int FindMinExp(int n) //通过传入random(a, b)中的差值n=b-a+1,取得最小的指数m, 使得 //2^m >= n.  
  15. {  
  16.       
  17.     int m=0;    //指数m  
  18.       
  19.     int n1 = n;        //差值n  
  20.       
  21.     while(n>=2)  
  22.           
  23.     {   
  24.           
  25.         n /= 2;  
  26.           
  27.         m ++;           
  28.           
  29.     }  
  30.       
  31.     if(pow(2, m)<n1)  
  32.           
  33.         m ++;  
  34.       
  35.     return m;          //返回最小的指数m.  
  36.       
  37. }  
  38.  
  39. int BinaryToDecimal(char bin[]) //二进制转换为十进制。      
  40.  
  41. {     
  42.       
  43.     int result = 0;     
  44.       
  45.     char *p = bin;     
  46.       
  47.     while (*p)     
  48.           
  49.     {     
  50.           
  51.         result = (result << 1 ) + (*p - '0');     
  52.           
  53.         p++;     
  54.           
  55.     }     
  56.       
  57.     return (result);     
  58.       
  59. }   
  60.  
  61. int Random(int a, int b)//产生a到b之间的随机数  失败则返回-1  
  62.  
  63. {  
  64.       
  65.     char string[20];  
  66.       
  67.     int i=0, m=0, n = b - a+1;  
  68.       
  69.     m = FindMinExp(n);              //取得最小的指数m, 使得 2^m >= n.  
  70.       
  71.     while(m)  
  72.           
  73.     {  
  74.           
  75.         int l=random();  
  76.         itoa(l,&string[i++],10);//注意这句很重要 将生成的01数字转换为字符型  
  77.         m --;  
  78.           
  79.     }  
  80.       
  81.     int generate_data = BinaryToDecimal (string);//m位比特串对应的整数。  
  82.       
  83.     if(generate_data+a >= a && generate_data +a<=b)//若在[a,b]范围内,则取此数,若不在则丢弃,//重新生成一个。  
  84.           
  85.         return generate_data+a;  
  86.     else 
  87.         return -1;  
  88.       
  89. }  
  90.  
  91. void main()  
  92. {  
  93.     srand((unsigned)time(0)); //要把这东西放在这里  
  94.     for(int i=0;i<10;)  
  95.     {  
  96.         int k=Random(1,6);  
  97.         if(k!=-1)  
  98.         {printf("%d  ",k);  
  99.         i++;  
  100.         }  
  101.     }  

        程序2:

       比程序1更简洁,区别在与对于二进制数的处理

 
  
  1. #include   "iostream.h "   
  2. #include   <time.h>   
  3. #include <math.h>  
  4. #include   <stdlib.h>   
  5. #include <iostream>  
  6. using namespace std;  
  7.  
  8. int   random()  //不知道对不对   等概率产生0和1  
  9. {   
  10.     int   a;   
  11.     a=rand()%2;         //rand()%2为随机产生一个0或1,   
  12.     return a;   
  13. }   
  14.  
  15.  
  16. int FindMinExp(int n) //通过传入random(a, b)中的差值n=b-a+1,取得最小的指数m, 使得 //2^m >= n.  
  17.  
  18. {  
  19.       
  20.      int m=0;    //指数m  
  21.       
  22.     int n1 = n;        //差值n  
  23.       
  24.     while(n>=2)  
  25.           
  26.     {   
  27.           
  28.         n /= 2;  
  29.           
  30.         m ++;           
  31.           
  32.     }  
  33.       
  34.     if(pow(2, m)<n1)  
  35.           
  36.         m ++;  
  37.       
  38.     return m;          //返回最小的指数m.  
  39.       
  40. }  
  41.  
  42.  
  43.  
  44. int Random(int a, int b)  
  45.  
  46. {  
  47.       
  48.     char string[20];  
  49.       
  50.     int i=0, m=0, n = b - a+1;  
  51.       
  52.     m = FindMinExp(n);              //取得最小的指数m, 使得 2^m >= n.  
  53.     int generate_data=0;  
  54.     while(m)  
  55.           
  56.     {  
  57.         generate_data<<=1;  //或者“<<1”?
  58.         generate_data=generate_data+ random();   
  59.         m --;  
  60.           
  61.     }  
  62.  
  63.     if(generate_data+a >= a && generate_data+a <=b)//若在[a,b]范围内,则取此数,若不在则丢弃,//重新生成一个。  
  64.           
  65.         return generate_data+a;  
  66.     else   
  67.         return -1;  
  68.       
  69. }