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))。