RANDOM(a,b)の実装

11974 ワード

ソースアドレス: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(0,1)の代わりにrandom関数を自分で書いたので、正しいかどうかは分からない.
        この問題の実現構想:
       この問題は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、ランダムに1つの[0,2^m)の中の整数を生成して、もしこの数がaの大きさをプラスして[a,b]内にあるならば、この数を取って結果にします.この数がaをプラスして[a,b]の外にあるならば、それを捨てて、再び1つを生成します.
        プログラム1
        1~6の数字を10個生成

  
  
  
  
  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. }