5.1-2
问题: 请描述RANDOM(a, b)过程的一种实现,它只调用RANDOM(0, 1)。作为a和b的函数,你的过程的期望运行时间是多少?
伪代码:
RANDOM(a, b) 1 n = b - a + 1 2 generate a new array A[1..<lgn>] //<lgn>表示大于等于lgn的整数 3 result = a - 1 //待返回的结果 4 while t not belong to [a, b] 5 for i = 1 to A.length 6 A[i] = RANDOM(0, 1) 7 result += A[i]x2^(A.length - i) 8 return result
代码实现:
#include <iostream> #include <stdlib.h> #include <time.h> #include <vector> #include <cmath> using namespace std; int RANDOM_0_1( void ) { return rand() % 2; } int RANDOM( int a, int b) { unsigned int n = b - a + 1; int num; if (pow(2, ( int )(log(n) / log(2))) == n) { num = log(n) / log(2); } else { num = (log(n) / log(2) + 1); } vector<int > A(num, 0); int result = a - 1; bool flag = true ; while (result < a || result > b) { if (flag) { result += 1; flag = false ; } for ( int i = 0 ; i < A.size() ; ++i) { A[i] = RANDOM_0_1(); result += A[i]*pow(2, A.size() - i - 1); } } return result; } int main() { srand((unsigned)time(NULL)); for ( int i = 0 ; i < 100 ; ++i) cout << RANDOM(0, 7) << ", " ; cout << endl; return 0; }
运行结果:
运行时间分析:
我们假设当随机产生的数落入区间:[a, b]闭区间时为成功,概率为p,则: ,相反,失败时概率为1-p;程序中的while循环档出现一次成功时就结束循环,返回结果,令X表示从开始直到出现第一次成功的次数,X服从几何分布 ;由于几何分布的期望公式为: ,生成一个θ(log(b-a+1)) 维数组的时间为:θ(log(b-a)) ;while循环中的内层循环的时间同样为θ(log(b-a)) ,而该内层循环的执行次数为X的期望次那么多,故函数整体期望运行时间为:θ(log(b-a))。